3516. Jumbo Tiny-X patch with Itsy support (#3527, Keith Packard).

This commit is contained in:
Robin Cutshaw 1999-12-30 03:03:21 +00:00
parent f13b792a3a
commit 30e35cb44b
50 changed files with 4155 additions and 1325 deletions

View File

@ -1,12 +1,12 @@
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/Imakefile,v 1.1 1999/11/19 13:53:47 hohndel Exp $
#include <Server.tmpl> #include <Server.tmpl>
SRCS = kcmap.c kcolor.c kdrive.c kinfo.c kinput.c kmap.c knoop.c ktest.c \ SRCS = kcmap.c kcolor.c kdrive.c kinfo.c kinput.c kmap.c knoop.c ktest.c \
ps2.c keyboard.c linux.c vga.c vga.c kasync.c kmode.c kcurscol.c
OBJS = kcmap.o kcolor.o kdrive.o kinfo.o kinput.o kmap.o knoop.o ktest.o \ OBJS = kcmap.o kcolor.o kdrive.o kinfo.o kinput.o kmap.o knoop.o ktest.o \
ps2.o keyboard.o linux.o vga.o vga.o kasync.o kmode.o kcurscol.o
INCLUDES = -I. -I$(XBUILDINCDIR) -I$(FONTINCSRC) \ INCLUDES = -I. -I$(XBUILDINCDIR) -I$(FONTINCSRC) \
-I../../fb -I../../mi -I../../include -I../../os \ -I../../fb -I../../mi -I../../include -I../../os \

View File

@ -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: $ */ /* $XFree86: xc/programs/Xserver/hw/kdrive/fbdev/fbdev.c,v 1.1 1999/11/19 13:53:52 hohndel Exp $ */
#include "fbdev.h" #include "fbdev.h"
@ -125,6 +125,12 @@ fbdevScreenInit (KdScreenInfo *screen)
return TRUE; return TRUE;
} }
Bool
fbdevInitScreen (ScreenPtr pScreen)
{
return TRUE;
}
void void
fbdevPreserve (KdCardInfo *card) fbdevPreserve (KdCardInfo *card)
{ {
@ -151,8 +157,10 @@ fbdevDPMS (ScreenPtr pScreen, int mode)
KdScreenPriv(pScreen); KdScreenPriv(pScreen);
FbdevPriv *priv = pScreenPriv->card->driver; FbdevPriv *priv = pScreenPriv->card->driver;
#ifdef FBIOPUT_POWERMODE
if (!ioctl (priv->fd, FBIOPUT_POWERMODE, &mode)) if (!ioctl (priv->fd, FBIOPUT_POWERMODE, &mode))
return TRUE; return TRUE;
#endif
return FALSE; return FALSE;
} }

View File

@ -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: $ */ /* $XFree86: xc/programs/Xserver/hw/kdrive/fbdev/fbdev.h,v 1.1 1999/11/19 13:53:52 hohndel Exp $ */
#ifndef _FBDEV_H_ #ifndef _FBDEV_H_
#define _FBDEV_H_ #define _FBDEV_H_
@ -50,6 +50,9 @@ fbdevCardInit (KdCardInfo *card);
Bool Bool
fbdevScreenInit (KdScreenInfo *screen); fbdevScreenInit (KdScreenInfo *screen);
Bool
fbdevInitScreen (ScreenPtr pScreen);
void void
fbdevPreserve (KdCardInfo *card); fbdevPreserve (KdCardInfo *card);

View File

@ -21,13 +21,14 @@
* 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: $ */ /* $XFree86: xc/programs/Xserver/hw/kdrive/fbdev/fbinit.c,v 1.1 1999/11/19 13:53:52 hohndel Exp $ */
#include <fbdev.h> #include <fbdev.h>
KdCardFuncs fbdevFuncs = { KdCardFuncs fbdevFuncs = {
fbdevCardInit, /* cardinit */ fbdevCardInit, /* cardinit */
fbdevScreenInit, /* scrinit */ fbdevScreenInit, /* scrinit */
fbdevInitScreen, /* initScreen */
fbdevPreserve, /* preserve */ fbdevPreserve, /* preserve */
fbdevEnable, /* enable */ fbdevEnable, /* enable */
fbdevDPMS, /* dpms */ fbdevDPMS, /* dpms */
@ -44,6 +45,7 @@ KdCardFuncs fbdevFuncs = {
0, /* initAccel */ 0, /* initAccel */
0, /* enableAccel */ 0, /* enableAccel */
0, /* syncAccel */
0, /* disableAccel */ 0, /* disableAccel */
0, /* finiAccel */ 0, /* finiAccel */
@ -71,8 +73,8 @@ InitInput (int argc, char **argv)
KdInitInput (&Ps2MouseFuncs, &LinuxKeyboardFuncs); KdInitInput (&Ps2MouseFuncs, &LinuxKeyboardFuncs);
} }
void int
OsVendorInit (void) ddxProcessArgument (int argc, char **argv, int i)
{ {
KdOsInit (&LinuxFuncs); return KdProcessArgument (argc, argv, i);
} }

View File

@ -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: $ */ /* $XFree86: xc/programs/Xserver/hw/kdrive/itsy/itsy.c,v 1.1 1999/11/19 13:53:53 hohndel Exp $ */
#include "itsy.h" #include "itsy.h"
@ -89,6 +89,46 @@ itsyScreenInit (KdScreenInfo *screen)
return TRUE; return TRUE;
} }
static unsigned short itsyIntensity[16] = {
0xffff,
0xffff,
0xedb6,
0xdb6d,
0xc924,
0xb6db,
0xa492,
0x9249,
0x8000,
0x6db6,
0x5b6d,
0x4924,
0x36db,
0x2492,
0x1249,
0x0000,
};
Bool
itsyCreateColormap (ColormapPtr pmap)
{
int i;
for (i = 0; i < 16; i++)
{
pmap->red[i].co.local.red = itsyIntensity[i];
pmap->red[i].co.local.green = itsyIntensity[i];
pmap->red[i].co.local.blue = itsyIntensity[i];
}
return TRUE;
}
Bool
itsyInitScreen (ScreenPtr pScreen)
{
pScreen->CreateColormap = itsyCreateColormap;
return TRUE;
}
void void
itsyPreserve (KdCardInfo *card) itsyPreserve (KdCardInfo *card)
{ {
@ -147,49 +187,10 @@ itsyCardFini (KdCardInfo *card)
fprintf (stderr, "itsyFini done\n"); fprintf (stderr, "itsyFini done\n");
} }
static unsigned short itsyIntensity[16] = {
0xffff,
0xffff,
0xedb6,
0xdb6d,
0xc924,
0xb6db,
0xa492,
0x9249,
0x8000,
0x6db6,
0x5b6d,
0x4924,
0x36db,
0x2492,
0x1249,
0x0000,
};
Bool
itsyCreateColormap (ColormapPtr pmap)
{
int i;
for (i = 0; i < 16; i++)
{
pmap->red[i].co.local.red = itsyIntensity[i];
pmap->red[i].co.local.green = itsyIntensity[i];
pmap->red[i].co.local.blue = itsyIntensity[i];
}
return TRUE;
}
Bool
itsySetupScreen (ScreenPtr pScreen)
{
pScreen->CreateColormap = itsyCreateColormap;
return FALSE;
}
KdCardFuncs itsyFuncs = { KdCardFuncs itsyFuncs = {
itsyCardInit, /* cardinit */ itsyCardInit, /* cardinit */
itsyScreenInit, /* scrinit */ itsyScreenInit, /* scrinit */
itsyInitScreen, /* initScreen */
itsyPreserve, /* preserve */ itsyPreserve, /* preserve */
itsyEnable, /* enable */ itsyEnable, /* enable */
itsyDPMS, /* dpms */ itsyDPMS, /* dpms */
@ -204,7 +205,7 @@ KdCardFuncs itsyFuncs = {
0, /* finiCursor */ 0, /* finiCursor */
0, /* recolorCursor */ 0, /* recolorCursor */
itsySetupScreen, /* initAccel */ 0, /* initAccel */
0, /* enableAccel */ 0, /* enableAccel */
0, /* disableAccel */ 0, /* disableAccel */
0, /* finiAccel */ 0, /* finiAccel */
@ -309,3 +310,9 @@ OsVendorInit (void)
{ {
KdOsInit (&ItsyOsFuncs); KdOsInit (&ItsyOsFuncs);
} }
int
ddxProcessArgument (int argc, char **argv, int i)
{
return KdProcessArgument (argc, argv, i);
}

16
hw/kdrive/linux/Imakefile Normal file
View File

@ -0,0 +1,16 @@
XCOMM $XConsortium: Imakefile /main/10 1996/12/02 10:20:33 lehors $
XCOMM $XFree86: $
#include <Server.tmpl>
SRCS = keyboard.c linux.c ps2.c
OBJS = keyboard.o linux.o ps2.o
INCLUDES = -I. -I.. -I$(XBUILDINCDIR) -I$(FONTINCSRC) \
-I../../../fb -I../../../mi -I../../../include -I../../../os \
-I$(EXTINCSRC) -I$(XINCLUDESRC)
NormalLibraryObjectRule()
NormalLibraryTarget(linux,$(OBJS))
DependTarget()

439
hw/kdrive/linux/keyboard.c Normal file
View File

@ -0,0 +1,439 @@
/*
* $Id$
*
* Copyright © 1999 Keith Packard
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
* the above copyright notice appear in all copies and that both that
* copyright notice and this permission notice appear in supporting
* documentation, and that the name of Keith Packard not be used in
* advertising or publicity pertaining to distribution of the software without
* specific, written prior permission. Keith Packard makes no
* representations about the suitability of this software for any purpose. It
* is provided "as is" without express or implied warranty.
*
* KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
* EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR
* CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
* DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
* TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
* PERFORMANCE OF THIS SOFTWARE.
*/
#include "kdrive.h"
#include "kkeymap.h"
#include <linux/keyboard.h>
#include <linux/kd.h>
#include <X11/keysym.h>
#include <termios.h>
extern int LinuxConsoleFd;
static const KeySym linux_to_x[256] = {
NoSymbol, NoSymbol, NoSymbol, NoSymbol,
NoSymbol, NoSymbol, NoSymbol, NoSymbol,
XK_BackSpace, XK_Tab, XK_Linefeed, NoSymbol,
NoSymbol, NoSymbol, NoSymbol, NoSymbol,
NoSymbol, NoSymbol, NoSymbol, NoSymbol,
NoSymbol, NoSymbol, NoSymbol, NoSymbol,
NoSymbol, NoSymbol, NoSymbol, XK_Escape,
NoSymbol, NoSymbol, NoSymbol, NoSymbol,
XK_space, XK_exclam, XK_quotedbl, XK_numbersign,
XK_dollar, XK_percent, XK_ampersand, XK_apostrophe,
XK_parenleft, XK_parenright, XK_asterisk, XK_plus,
XK_comma, XK_minus, XK_period, XK_slash,
XK_0, XK_1, XK_2, XK_3,
XK_4, XK_5, XK_6, XK_7,
XK_8, XK_9, XK_colon, XK_semicolon,
XK_less, XK_equal, XK_greater, XK_question,
XK_at, XK_A, XK_B, XK_C,
XK_D, XK_E, XK_F, XK_G,
XK_H, XK_I, XK_J, XK_K,
XK_L, XK_M, XK_N, XK_O,
XK_P, XK_Q, XK_R, XK_S,
XK_T, XK_U, XK_V, XK_W,
XK_X, XK_Y, XK_Z, XK_bracketleft,
XK_backslash, XK_bracketright,XK_asciicircum, XK_underscore,
XK_grave, XK_a, XK_b, XK_c,
XK_d, XK_e, XK_f, XK_g,
XK_h, XK_i, XK_j, XK_k,
XK_l, XK_m, XK_n, XK_o,
XK_p, XK_q, XK_r, XK_s,
XK_t, XK_u, XK_v, XK_w,
XK_x, XK_y, XK_z, XK_braceleft,
XK_bar, XK_braceright, XK_asciitilde, XK_Delete,
NoSymbol, NoSymbol, NoSymbol, NoSymbol,
NoSymbol, NoSymbol, NoSymbol, NoSymbol,
NoSymbol, NoSymbol, NoSymbol, NoSymbol,
NoSymbol, NoSymbol, NoSymbol, NoSymbol,
NoSymbol, NoSymbol, NoSymbol, NoSymbol,
NoSymbol, NoSymbol, NoSymbol, NoSymbol,
NoSymbol, NoSymbol, NoSymbol, NoSymbol,
NoSymbol, NoSymbol, NoSymbol, NoSymbol,
XK_nobreakspace,XK_exclamdown, XK_cent, XK_sterling,
XK_currency, XK_yen, XK_brokenbar, XK_section,
XK_diaeresis, XK_copyright, XK_ordfeminine, XK_guillemotleft,
XK_notsign, XK_hyphen, XK_registered, XK_macron,
XK_degree, XK_plusminus, XK_twosuperior, XK_threesuperior,
XK_acute, XK_mu, XK_paragraph, XK_periodcentered,
XK_cedilla, XK_onesuperior, XK_masculine, XK_guillemotright,
XK_onequarter, XK_onehalf, XK_threequarters,XK_questiondown,
XK_Agrave, XK_Aacute, XK_Acircumflex, XK_Atilde,
XK_Adiaeresis, XK_Aring, XK_AE, XK_Ccedilla,
XK_Egrave, XK_Eacute, XK_Ecircumflex, XK_Ediaeresis,
XK_Igrave, XK_Iacute, XK_Icircumflex, XK_Idiaeresis,
XK_ETH, XK_Ntilde, XK_Ograve, XK_Oacute,
XK_Ocircumflex, XK_Otilde, XK_Odiaeresis, XK_multiply,
XK_Ooblique, XK_Ugrave, XK_Uacute, XK_Ucircumflex,
XK_Udiaeresis, XK_Yacute, XK_THORN, XK_ssharp,
XK_agrave, XK_aacute, XK_acircumflex, XK_atilde,
XK_adiaeresis, XK_aring, XK_ae, XK_ccedilla,
XK_egrave, XK_eacute, XK_ecircumflex, XK_ediaeresis,
XK_igrave, XK_iacute, XK_icircumflex, XK_idiaeresis,
XK_eth, XK_ntilde, XK_ograve, XK_oacute,
XK_ocircumflex, XK_otilde, XK_odiaeresis, XK_division,
XK_oslash, XK_ugrave, XK_uacute, XK_ucircumflex,
XK_udiaeresis, XK_yacute, XK_thorn, XK_ydiaeresis
};
static unsigned char tbl[KD_MAX_WIDTH] =
{
0,
1 << KG_SHIFT,
(1 << KG_ALT),
(1 << KG_ALT) | (1 << KG_SHIFT)
};
static void
readKernelMapping()
{
KeySym *k;
int i, j;
struct kbentry kbe;
int minKeyCode, maxKeyCode;
minKeyCode = NR_KEYS;
maxKeyCode = 0;
k = kdKeymap;
for (i = 0;
i < NR_KEYS && (maxKeyCode - minKeyCode + 1) < KD_MAX_LENGTH;
++i)
{
kbe.kb_index = i;
for (j = 0; j < KD_MAX_WIDTH; ++j)
{
unsigned short kval;
k[j] = NoSymbol;
kbe.kb_table = tbl[j];
if (ioctl(LinuxConsoleFd, KDGKBENT, &kbe))
continue;
kval = KVAL(kbe.kb_value);
switch (KTYP(kbe.kb_value))
{
case KT_LATIN:
case KT_LETTER:
k[j] = linux_to_x[kval];
break;
case KT_FN:
if (kval <= 19)
k[j] = XK_F1 + kval;
else switch (kbe.kb_value)
{
case K_FIND:
k[j] = XK_Home; /* or XK_Find */
break;
case K_INSERT:
k[j] = XK_Insert;
break;
case K_REMOVE:
k[j] = XK_Delete;
break;
case K_SELECT:
k[j] = XK_End; /* or XK_Select */
break;
case K_PGUP:
k[j] = XK_Prior;
break;
case K_PGDN:
k[j] = XK_Next;
break;
case K_HELP:
k[j] = XK_Help;
break;
case K_DO:
k[j] = XK_Execute;
break;
case K_PAUSE:
k[j] = XK_Pause;
break;
case K_MACRO:
k[j] = XK_Menu;
break;
default:
break;
}
break;
case KT_SPEC:
switch (kbe.kb_value)
{
case K_ENTER:
k[j] = XK_Return;
break;
case K_BREAK:
k[j] = XK_Break;
break;
case K_CAPS:
k[j] = XK_Caps_Lock;
break;
case K_NUM:
k[j] = XK_Num_Lock;
break;
case K_HOLD:
k[j] = XK_Scroll_Lock;
break;
case K_COMPOSE:
k[j] = XK_Multi_key;
break;
default:
break;
}
break;
case KT_PAD:
switch (kbe.kb_value)
{
case K_PPLUS:
k[j] = XK_KP_Add;
break;
case K_PMINUS:
k[j] = XK_KP_Subtract;
break;
case K_PSTAR:
k[j] = XK_KP_Multiply;
break;
case K_PSLASH:
k[j] = XK_KP_Divide;
break;
case K_PENTER:
k[j] = XK_KP_Enter;
break;
case K_PCOMMA:
k[j] = XK_KP_Separator;
break;
case K_PDOT:
k[j] = XK_KP_Decimal;
break;
case K_PPLUSMINUS:
k[j] = XK_KP_Subtract;
break;
default:
if (kval <= 9)
k[j] = XK_KP_0 + kval;
break;
}
break;
/*
* KT_DEAD keys are for accelerated diacritical creation.
*/
case KT_DEAD:
switch (kbe.kb_value)
{
case K_DGRAVE:
k[j] = XK_dead_grave;
break;
case K_DACUTE:
k[j] = XK_dead_acute;
break;
case K_DCIRCM:
k[j] = XK_dead_circumflex;
break;
case K_DTILDE:
k[j] = XK_dead_tilde;
break;
case K_DDIERE:
k[j] = XK_dead_diaeresis;
break;
}
break;
case KT_CUR:
switch (kbe.kb_value)
{
case K_DOWN:
k[j] = XK_Down;
break;
case K_LEFT:
k[j] = XK_Left;
break;
case K_RIGHT:
k[j] = XK_Right;
break;
case K_UP:
k[j] = XK_Up;
break;
}
break;
case KT_SHIFT:
switch (kbe.kb_value)
{
case K_ALTGR:
k[j] = XK_Alt_R;
break;
case K_ALT:
k[j] = (kbe.kb_index == 0x64 ?
XK_Alt_R : XK_Alt_L);
break;
case K_CTRL:
k[j] = (kbe.kb_index == 0x61 ?
XK_Control_R : XK_Control_L);
break;
case K_CTRLL:
k[j] = XK_Control_L;
break;
case K_CTRLR:
k[j] = XK_Control_R;
break;
case K_SHIFT:
k[j] = (kbe.kb_index == 0x36 ?
XK_Shift_R : XK_Shift_L);
break;
case K_SHIFTL:
k[j] = XK_Shift_L;
break;
case K_SHIFTR:
k[j] = XK_Shift_R;
break;
default:
break;
}
break;
/*
* KT_ASCII keys accumulate a 3 digit decimal number that gets
* emitted when the shift state changes. We can't emulate that.
*/
case KT_ASCII:
break;
case KT_LOCK:
if (kbe.kb_value == K_SHIFTLOCK)
k[j] = XK_Shift_Lock;
break;
default:
break;
}
if (i < minKeyCode)
minKeyCode = i;
if (i > maxKeyCode)
maxKeyCode = i;
}
if (minKeyCode == NR_KEYS)
continue;
if (k[3] == k[2]) k[3] = NoSymbol;
if (k[2] == k[1]) k[2] = NoSymbol;
if (k[1] == k[0]) k[1] = NoSymbol;
if (k[0] == k[2] && k[1] == k[3]) k[2] = k[3] = NoSymbol;
if (k[3] == k[0] && k[2] == k[1] && k[2] == NoSymbol) k[3] =NoSymbol;
k += KD_MAX_WIDTH;
}
kdMinScanCode = minKeyCode;
kdMaxScanCode = maxKeyCode;
}
void
LinuxKeyboardLoad (void)
{
readKernelMapping ();
}
static int LinuxKbdTrans;
static struct termios LinuxTermios;
int
LinuxKeyboardInit (void)
{
struct termios nTty;
ioctl (LinuxConsoleFd, KDGKBMODE, &LinuxKbdTrans);
tcgetattr (LinuxConsoleFd, &LinuxTermios);
ioctl(LinuxConsoleFd, KDSKBMODE, K_MEDIUMRAW);
nTty = LinuxTermios;
nTty.c_iflag = (IGNPAR | IGNBRK) & (~PARMRK) & (~ISTRIP);
nTty.c_oflag = 0;
nTty.c_cflag = CREAD | CS8;
nTty.c_lflag = 0;
nTty.c_cc[VTIME]=0;
nTty.c_cc[VMIN]=1;
cfsetispeed(&nTty, 9600);
cfsetospeed(&nTty, 9600);
tcsetattr(LinuxConsoleFd, TCSANOW, &nTty);
return LinuxConsoleFd;
}
void
LinuxKeyboardFini (int fd)
{
ioctl(LinuxConsoleFd, KDSKBMODE, LinuxKbdTrans);
tcsetattr(LinuxConsoleFd, TCSANOW, &LinuxTermios);
}
void
LinuxKeyboardRead (int fd)
{
unsigned char buf[256], *b;
int n;
while ((n = read (fd, buf, sizeof (buf))) > 0)
{
b = buf;
while (n--)
{
KdEnqueueKeyboardEvent (b[0] & 0x7f, b[0] & 0x80);
b++;
}
}
}
void
LinuxKeyboardLeds (int leds)
{
ioctl (LinuxConsoleFd, KDSETLED, leds & 7);
}
void
LinuxKeyboardBell (int volume, int pitch, int duration)
{
if (volume && pitch)
{
ioctl(LinuxConsoleFd, KDMKTONE,
((1193190 / pitch) & 0xffff) |
(((unsigned long)duration *
volume / 50) << 16));
}
}
KdKeyboardFuncs LinuxKeyboardFuncs = {
LinuxKeyboardLoad,
LinuxKeyboardInit,
LinuxKeyboardRead,
LinuxKeyboardLeds,
LinuxKeyboardBell,
LinuxKeyboardFini,
3,
};

329
hw/kdrive/linux/linux.c Normal file
View File

@ -0,0 +1,329 @@
/*
* $Id$
*
* Copyright © 1999 Keith Packard
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
* the above copyright notice appear in all copies and that both that
* copyright notice and this permission notice appear in supporting
* documentation, and that the name of Keith Packard not be used in
* advertising or publicity pertaining to distribution of the software without
* specific, written prior permission. Keith Packard makes no
* representations about the suitability of this software for any purpose. It
* is provided "as is" without express or implied warranty.
*
* KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
* EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR
* CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
* DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
* TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
* PERFORMANCE OF THIS SOFTWARE.
*/
#include "kdrive.h"
#include <errno.h>
#include <signal.h>
#include <linux/vt.h>
#include <linux/kd.h>
#include <sys/stat.h>
#include <keysym.h>
static int vtno;
int LinuxConsoleFd;
static int activeVT;
static Bool enabled;
void
LinuxVTRequest (int sig)
{
kdSwitchPending = TRUE;
}
/* Check before chowning -- this avoids touching the file system */
void
LinuxCheckChown (char *file)
{
struct stat st;
__uid_t u;
__gid_t g;
if (stat (file, &st) < 0)
return;
u = getuid ();
g = getgid ();
if (st.st_uid != u || st.st_gid != g)
chown (file, u, g);
}
int
LinuxInit ()
{
int i, fd;
char vtname[11];
struct vt_stat vts;
struct stat statb;
LinuxConsoleFd = -1;
/* check if we're run with euid==0 */
if (geteuid() != 0)
{
FatalError("LinuxInit: Server must be suid root\n");
}
if ((fd = open("/dev/tty0",O_WRONLY,0)) < 0)
{
FatalError(
"LinuxInit: Cannot open /dev/tty0 (%s)\n",
strerror(errno));
}
if ((ioctl(fd, VT_OPENQRY, &vtno) < 0) ||
(vtno == -1))
{
FatalError("xf86OpenConsole: Cannot find a free VT\n");
}
close(fd);
/* ErrorF("(using VT number %d)\n\n", vtno); */
sprintf(vtname,"/dev/tty%d",vtno); /* /dev/tty1-64 */
if ((LinuxConsoleFd = open(vtname, O_RDWR|O_NDELAY, 0)) < 0)
{
FatalError("LinuxInit: Cannot open %s (%s)\n",
vtname, strerror(errno));
}
/* change ownership of the vt */
LinuxCheckChown (vtname);
/*
* the current VT device we're running on is not "console", we want
* to grab all consoles too
*
* Why is this needed?
*/
LinuxCheckChown ("/dev/tty0");
/*
* Linux doesn't switch to an active vt after the last close of a vt,
* so we do this ourselves by remembering which is active now.
*/
if (ioctl(LinuxConsoleFd, VT_GETSTATE, &vts) == 0)
{
activeVT = vts.v_active;
}
return 1;
}
Bool
LinuxFindPci (CARD16 vendor, CARD16 device, CARD32 count, KdCardAttr *attr)
{
FILE *f;
char line[2048], *l, *end;
CARD32 bus, id, mode, addr;
int n;
CARD32 ven_dev;
Bool ret = FALSE;
int i;
ven_dev = (((CARD32) vendor) << 16) | ((CARD32) device);
f = fopen ("/proc/bus/pci/devices", "r");
if (!f)
return FALSE;
attr->io = 0;
while (fgets (line, sizeof (line)-1, f))
{
line[sizeof(line)-1] = '\0';
l = line;
bus = strtoul (l, &end, 16);
if (end == l)
continue;
l = end;
id = strtoul (l, &end, 16);
if (end == l)
continue;
l = end;
if (id != ven_dev)
continue;
if (count--)
continue;
(void) strtoul (l, &end, 16);
if (end == l)
continue;
l = end;
n = 0;
for (i = 0; i < 6; i++)
{
addr = strtoul (l, &end, 16);
if (end == l)
break;
if (addr & 1)
attr->io = addr & ~0xf;
else
{
if (n == KD_MAX_CARD_ADDRESS)
break;
attr->address[n++] = addr & ~0xf;
}
l = end;
}
while (n > 0)
{
if (attr->address[n-1] != 0)
break;
n--;
}
attr->naddr = n;
ret = TRUE;
break;
}
fclose (f);
return ret;
}
void
LinuxEnable (void)
{
struct sigaction act;
struct vt_mode VT;
if (enabled)
return;
if (kdSwitchPending)
{
kdSwitchPending = FALSE;
ioctl (LinuxConsoleFd, VT_RELDISP, VT_ACKACQ);
}
/*
* now get the VT
*/
if (ioctl(LinuxConsoleFd, VT_ACTIVATE, vtno) != 0)
{
ErrorF("LinuxInit: VT_ACTIVATE failed\n");
}
if (ioctl(LinuxConsoleFd, VT_WAITACTIVE, vtno) != 0)
{
ErrorF("LinuxInit: VT_WAITACTIVE failed\n");
}
if (ioctl(LinuxConsoleFd, VT_GETMODE, &VT) < 0)
{
FatalError ("LinuxInit: VT_GETMODE failed\n");
}
act.sa_handler = LinuxVTRequest;
sigemptyset (&act.sa_mask);
act.sa_flags = 0;
act.sa_restorer = 0;
sigaction (SIGUSR1, &act, 0);
VT.mode = VT_PROCESS;
VT.relsig = SIGUSR1;
VT.acqsig = SIGUSR1;
if (ioctl(LinuxConsoleFd, VT_SETMODE, &VT) < 0)
{
FatalError("LinuxInit: VT_SETMODE VT_PROCESS failed\n");
}
if (ioctl(LinuxConsoleFd, KDSETMODE, KD_GRAPHICS) < 0)
{
FatalError("LinuxInit: KDSETMODE KD_GRAPHICS failed\n");
}
enabled = TRUE;
}
Bool
LinuxSpecialKey (KeySym sym)
{
struct vt_stat vts;
int con;
if (XK_F1 <= sym && sym <= XK_F12)
{
con = sym - XK_F1 + 1;
ioctl (LinuxConsoleFd, VT_GETSTATE, &vts);
if (con != vts.v_active && (vts.v_state & (1 << con)))
{
ioctl (LinuxConsoleFd, VT_ACTIVATE, con);
return TRUE;
}
}
return FALSE;
}
void
LinuxDisable (void)
{
ioctl(LinuxConsoleFd, KDSETMODE, KD_TEXT); /* Back to text mode ... */
if (kdSwitchPending)
{
kdSwitchPending = FALSE;
ioctl (LinuxConsoleFd, VT_RELDISP, 1);
}
enabled = FALSE;
}
void
LinuxFini (void)
{
struct vt_mode VT;
struct vt_stat vts;
int fd;
if (LinuxConsoleFd < 0)
return;
if (ioctl(LinuxConsoleFd, VT_GETMODE, &VT) != -1)
{
VT.mode = VT_AUTO;
ioctl(LinuxConsoleFd, VT_SETMODE, &VT); /* set dflt vt handling */
}
ioctl (LinuxConsoleFd, VT_GETSTATE, &vts);
/*
* Find a legal VT to switch to, either the one we started from
* or the lowest active one that isn't ours
*/
if (activeVT < 0 ||
activeVT == vts.v_active ||
!(vts.v_state & (1 << activeVT)))
{
for (activeVT = 1; activeVT < 16; activeVT++)
if (activeVT != vtno && (vts.v_state & (1 << activeVT)))
break;
if (activeVT == 16)
activeVT = -1;
}
/*
* Perform a switch back to the active VT when we were started
*/
if (activeVT >= -1)
{
ioctl (LinuxConsoleFd, VT_ACTIVATE, activeVT);
ioctl (LinuxConsoleFd, VT_WAITACTIVE, activeVT);
activeVT = -1;
}
close(LinuxConsoleFd); /* make the vt-manager happy */
fd = open ("/dev/tty0", O_RDWR|O_NDELAY, 0);
if (fd >= 0)
{
ioctl (fd, VT_GETSTATE, &vts);
if (ioctl (fd, VT_DISALLOCATE, vtno) < 0)
fprintf (stderr, "Can't deallocate console %d errno %d\n", vtno, errno);
close (fd);
}
return;
}
KdOsFuncs LinuxFuncs = {
LinuxInit,
LinuxEnable,
LinuxSpecialKey,
LinuxDisable,
LinuxFini,
};
void
OsVendorInit (void)
{
KdOsInit (&LinuxFuncs);
}

131
hw/kdrive/linux/ps2.c Normal file
View File

@ -0,0 +1,131 @@
/*
* $Id$
*
* Copyright © 1999 Keith Packard
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
* the above copyright notice appear in all copies and that both that
* copyright notice and this permission notice appear in supporting
* documentation, and that the name of Keith Packard not be used in
* advertising or publicity pertaining to distribution of the software without
* specific, written prior permission. Keith Packard makes no
* representations about the suitability of this software for any purpose. It
* is provided "as is" without express or implied warranty.
*
* KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
* EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR
* CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
* DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
* TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
* PERFORMANCE OF THIS SOFTWARE.
*/
#define NEED_EVENTS
#include "X.h"
#include "Xproto.h"
#include "inputstr.h"
#include "scrnintstr.h"
#include "kdrive.h"
#include "Xpoll.h"
int
Ps2ReadBytes (int fd, char *buf, int len, int min)
{
int n, tot;
fd_set set;
struct timeval tv;
tot = 0;
while (len)
{
n = read (fd, buf, len);
if (n > 0)
{
tot += n;
buf += n;
len -= n;
}
if (tot % min == 0)
break;
FD_ZERO (&set);
FD_SET (fd, &set);
tv.tv_sec = 0;
tv.tv_usec = 100 * 1000;
n = select (fd + 1, &set, 0, 0, &tv);
if (n <= 0)
break;
}
return tot;
}
void
Ps2Read (int ps2Port)
{
unsigned char buf[3 * 200];
unsigned char *b;
int n;
int dx, dy;
unsigned long flags;
while ((n = Ps2ReadBytes (ps2Port, buf, sizeof (buf), 3)) > 0)
{
b = buf;
while (n >= 3)
{
flags = KD_MOUSE_DELTA;
if (b[0] & 4)
flags |= KD_BUTTON_2;
if (b[0] & 2)
flags |= KD_BUTTON_3;
if (b[0] & 1)
flags |= KD_BUTTON_1;
dx = b[1];
if (b[0] & 0x10)
dx -= 256;
dy = b[2];
if (b[0] & 0x20)
dy -= 256;
dy = -dy;
n -= 3;
b += 3;
KdEnqueueMouseEvent (flags, dx, dy);
}
}
}
char *Ps2Names[] = {
"/dev/psaux",
"/dev/mouse",
};
#define NUM_PS2_NAMES (sizeof (Ps2Names) / sizeof (Ps2Names[0]))
int
Ps2Init (void)
{
int i;
int ps2Port;
for (i = 0; i < NUM_PS2_NAMES; i++)
{
ps2Port = open (Ps2Names[i], 0);
if (ps2Port >= 0)
return ps2Port;
}
}
void
Ps2Fini (int ps2Port)
{
if (ps2Port >= 0)
close (ps2Port);
}
KdMouseFuncs Ps2MouseFuncs = {
Ps2Init,
Ps2Read,
Ps2Fini
};

File diff suppressed because it is too large Load Diff

View File

@ -22,7 +22,7 @@
* *
* Author: Keith Packard, SuSE, Inc. * Author: Keith Packard, SuSE, Inc.
*/ */
/* $XFree86: $ */ /* $XFree86: xc/programs/Xserver/hw/kdrive/savage/s3.h,v 1.1 1999/11/19 13:53:55 hohndel Exp $ */
#ifndef _S3_H_ #ifndef _S3_H_
#define _S3_H_ #define _S3_H_
@ -30,8 +30,6 @@
#include "kdrive.h" #include "kdrive.h"
#include "s3reg.h" #include "s3reg.h"
#define PLATFORM 300
/* VESA Approved Register Definitions */ /* VESA Approved Register Definitions */
/* /*
@ -74,14 +72,42 @@ typedef volatile struct _s3 {
VOL32 alt_mix; /* 8134 */ VOL32 alt_mix; /* 8134 */
VOL32 scissors_tl; /* 8138 */ VOL32 scissors_tl; /* 8138 */
VOL32 scissors_br; /* 813c */ VOL32 scissors_br; /* 813c */
#if 0
VOL16 pix_cntl; /* 8140 */ VOL16 pix_cntl; /* 8140 */
VOL16 mult_misc2; /* 8142 */ VOL16 mult_misc2; /* 8142 */
#else
VOL32 pix_cntl_mult_misc2; /* 8140 */
#endif
VOL32 mult_misc_read_sel; /* 8144 */ VOL32 mult_misc_read_sel; /* 8144 */
VOL32 alt_pcnt; /* 8148 min_axis_pcnt, maj_axis_pcnt */ VOL32 alt_pcnt; /* 8148 min_axis_pcnt, maj_axis_pcnt */
VOL8 _pad3[0x19c]; /* 814c */ VOL8 _pad3a[0x1c]; /* 814c */
VOL32 global_bitmap_1; /* 8168 */
VOL32 global_bitmap_2; /* 816c */
VOL32 primary_bitmap_1; /* 8170 */
VOL32 primary_bitmap_2; /* 8174 */
VOL32 secondary_bitmap_1; /* 8178 */
VOL32 secondary_bitmap_2; /* 817c */
VOL32 primary_stream_control; /* 8180 */
VOL32 chroma_key_control; /* 8184 */
VOL32 genlocking_control; /* 8188 */
VOL8 _pad3b[0x4]; /* 818c */
VOL32 secondary_stream_control; /* 8190 */
VOL32 chroma_key_upper_bound; /* 8194 */
VOL32 secondary_stream_h_scale; /* 8198 */
VOL32 color_adjustment; /* 819c */
VOL32 blend_control; /* 81a0 */
VOL8 _pad3c[0x1c]; /* 81a4 */
VOL32 primary_stream_addr_0; /* 81c0 */
VOL8 _pad3d[0x124]; /* 81c4 */
#if 0
VOL16 cur_y; /* 82e8 */ VOL16 cur_y; /* 82e8 */
VOL8 _pad4[0xc6]; /* 82ea */ VOL8 _pad4[0xc6]; /* 82ea */
#else
VOL32 cur_y; /* 82e8 */
VOL8 _pad4[0xc4]; /* 82ec */
#endif
#if 0
VOL8 crt_vga_3b0; /* 83b0 */ VOL8 crt_vga_3b0; /* 83b0 */
VOL8 crt_vga_3b1; /* 83b1 */ VOL8 crt_vga_3b1; /* 83b1 */
VOL8 crt_vga_3b2; /* 83b2 */ VOL8 crt_vga_3b2; /* 83b2 */
@ -136,6 +162,8 @@ typedef volatile struct _s3 {
VOL8 _pad5[0x124]; /* 83e0 */ VOL8 _pad5[0x124]; /* 83e0 */
VOL16 subsys_status; /* 8504 */ VOL16 subsys_status; /* 8504 */
VOL8 _pad6[0x6]; /* 8506 */ VOL8 _pad6[0x6]; /* 8506 */
VOL32 subsys_status; /* 8504 */
VOL8 _pad6[0x4]; /* 8508 */
VOL16 adv_control; /* 850c */ VOL16 adv_control; /* 850c */
VOL8 _pad7[0x1da]; /* 850e */ VOL8 _pad7[0x1da]; /* 850e */
VOL16 cur_x; /* 86e8 */ VOL16 cur_x; /* 86e8 */
@ -168,10 +196,14 @@ typedef volatile struct _s3 {
VOL8 _pad21[0x3fe]; /* baea */ VOL8 _pad21[0x3fe]; /* baea */
VOL16 enh_rd_reg_dt; /* bee8 */ VOL16 enh_rd_reg_dt; /* bee8 */
VOL8 _pad22[0x23fe]; /* beea */ VOL8 _pad22[0x23fe]; /* beea */
#else
VOL8 _pad_reg[0x5f38]; /* 83b0 */
#endif
VOL32 pix_trans; /* e2e8 */ VOL32 pix_trans; /* e2e8 */
VOL8 _pad23[0x3a974]; /* e2ec */ VOL8 _pad23[0x3a974]; /* e2ec */
VOL32 alt_status_0; /* 48c60 */ VOL32 alt_status_0; /* 48c60 */
VOL32 alt_status_1; /* 48c64 */
} S3, *S3Ptr; } S3, *S3Ptr;
#define VGA_STATUS_1_DTM 0x01 #define VGA_STATUS_1_DTM 0x01
@ -221,6 +253,7 @@ typedef volatile struct _s3 {
#define PATTERN_L 0x8000 #define PATTERN_L 0x8000
#define PATTERN_H 0x9000 #define PATTERN_H 0x9000
#define PIX_CNTL 0xa000 #define PIX_CNTL 0xa000
#define CONTROL_MISC2 0xd000
#define PIX_TRANS 0xe2e8 #define PIX_TRANS 0xe2e8
/* Advanced Function Control Regsiter */ /* Advanced Function Control Regsiter */
@ -339,8 +372,8 @@ typedef volatile struct _s3 {
#define S3_SAVAGE4_SLOTS 0x0001ffff #define S3_SAVAGE4_SLOTS 0x0001ffff
#define S3_SAVAGE4_2DI 0x00800000 #define S3_SAVAGE4_2DI 0x00800000
#define _s3WaitLoop(mask,value){ \ #define _s3WaitLoop(s3,mask,value){ \
int __loop = 100000; \ int __loop = 1000000; \
while (((s3)->alt_status_0 & (mask)) != (value)) \ while (((s3)->alt_status_0 & (mask)) != (value)) \
if (--__loop == 0) { \ if (--__loop == 0) { \
ErrorF ("savage wait loop failed 0x%x\n", s3->alt_status_0); \ ErrorF ("savage wait loop failed 0x%x\n", s3->alt_status_0); \
@ -348,11 +381,21 @@ typedef volatile struct _s3 {
} \ } \
} }
#define _s3WaitSlot(s3) _s3WaitLoop(0x1, 0x0) #define S3_SAVAGE4_ROOM 10
#define _s3WaitEmpty(s3) _s3WaitLoop(S3_SAVAGE4_SLOTS, 0)
#define _s3WaitIdleEmpty(s3) _s3WaitLoop(S3_SAVAGE4_SLOTS|S3_SAVAGE4_2DI, \ #define _s3WaitSlots(s3,n) { \
int __loop = 1000000; \
while (((s3)->alt_status_0 & S3_SAVAGE4_SLOTS) >= S3_SAVAGE4_ROOM-(n)) \
if (--__loop == 0) { \
ErrorF ("savage wait loop failed 0x%x\n", s3->alt_status_0); \
break; \
} \
}
#define _s3WaitEmpty(s3) _s3WaitLoop(s3,S3_SAVAGE4_SLOTS, 0)
#define _s3WaitIdleEmpty(s3) _s3WaitLoop(s3,S3_SAVAGE4_SLOTS|S3_SAVAGE4_2DI, \
S3_SAVAGE4_2DI) S3_SAVAGE4_2DI)
#define _s3WaitIdle(s3) _s3WaitLoop(S3_SAVAGE4_2DI, S3_SAVAGE4_2DI) #define _s3WaitIdle(s3) _s3WaitLoop(s3,S3_SAVAGE4_2DI, S3_SAVAGE4_2DI)
typedef struct _s3Cursor { typedef struct _s3Cursor {
int width, height; int width, height;
@ -376,14 +419,9 @@ typedef struct _s3Patterns {
#define S3_CLOCK_REF 14318 /* KHz */ #define S3_CLOCK_REF 14318 /* KHz */
#define S3_CLOCK(m,n,r) (S3_CLOCK_REF * ((m) + 2) / (((n) + 2) * (1 << (r)))) #define S3_CLOCK(m,n,r) ((S3_CLOCK_REF * ((m) + 2)) / (((n) + 2) * (1 << (r))))
#if PLATFORM == 200 #define S3_MAX_CLOCK 150000 /* KHz */
#define S3_MAX_CLOCK 80000 /* KHz */
#endif
#if PLATFORM == 300
#define S3_MAX_CLOCK 135000 /* KHz */
#endif
typedef struct _s3Timing { typedef struct _s3Timing {
/* label */ /* label */
@ -417,6 +455,10 @@ typedef struct _s3Save {
CARD32 write_mask; CARD32 write_mask;
CARD32 fg; CARD32 fg;
CARD32 bg; CARD32 bg;
CARD32 global_bitmap_1;
CARD32 global_bitmap_2;
CARD32 primary_bitmap_1;
CARD32 primary_bitmap_2;
CARD8 text_save[S3_TEXT_SAVE]; CARD8 text_save[S3_TEXT_SAVE];
} S3Save; } S3Save;
@ -427,6 +469,8 @@ typedef struct _s3CardInfo {
CARD8 *registers; /* pointer to register map */ CARD8 *registers; /* pointer to register map */
S3Vga s3vga; S3Vga s3vga;
S3Save save; S3Save save;
Bool need_sync;
Bool bios_initialized; /* whether the bios has been run */
} S3CardInfo; } S3CardInfo;
typedef struct _s3ScreenInfo { typedef struct _s3ScreenInfo {
@ -438,6 +482,9 @@ typedef struct _s3ScreenInfo {
int offscreen_height; /* height of offscreen area */ int offscreen_height; /* height of offscreen area */
S3Cursor cursor; S3Cursor cursor;
S3Patterns patterns; S3Patterns patterns;
Bool manage_border;
Bool managing_border;
CARD32 border_pixel;
} S3ScreenInfo; } S3ScreenInfo;
#define getS3CardInfo(kd) ((S3CardInfo *) ((kd)->card->driver)) #define getS3CardInfo(kd) ((S3CardInfo *) ((kd)->card->driver))
@ -460,6 +507,7 @@ void s3RecolorCursor (ScreenPtr pScreen, int ndef, xColorItem *pdefs);
Bool s3DrawInit (ScreenPtr pScreen); Bool s3DrawInit (ScreenPtr pScreen);
void s3DrawEnable (ScreenPtr pScreen); void s3DrawEnable (ScreenPtr pScreen);
void s3DrawSync (ScreenPtr pScreen);
void s3DrawDisable (ScreenPtr pScreen); void s3DrawDisable (ScreenPtr pScreen);
void s3DrawFini (ScreenPtr pScreen); void s3DrawFini (ScreenPtr pScreen);
@ -470,10 +518,6 @@ void S3InitCard (KdCardAttr *attr);
void s3GetClock (int target, int *Mp, int *Np, int *Rp, int maxM, int maxN, int maxR); void s3GetClock (int target, int *Mp, int *Np, int *Rp, int maxM, int maxN, int maxR);
#define S3ModeClock(t) (((t->horizontal + t->hblank) * \
(t->vertical + t->vblank) * \
t->rate) / 1000)
extern KdCardFuncs s3Funcs; extern KdCardFuncs s3Funcs;
/* /*
@ -488,26 +532,22 @@ extern KdCardFuncs s3Funcs;
#define DRAW_DEBUG(a) #define DRAW_DEBUG(a)
#define _s3WaitVRetrace(s3) { \ #define _s3WaitVRetrace(s3vga) { \
VOL8 *_status = &s3->crt_vga_status_1; \
int _loop_count; \ int _loop_count; \
DRAW_DEBUG ((DEBUG_CRTC, "_s3WaitVRetrace 0x%x", *_status)); \
_loop_count = 0; \ _loop_count = 0; \
while ((*_status & VGA_STATUS_1_VSY) != 0) S3_RETRACE_LOOP_CHECK; \ while (s3GetImm(s3vga, s3_vertical_sync_active) != 0) S3_RETRACE_LOOP_CHECK; \
_loop_count = 0; \ _loop_count = 0; \
while ((*_status & VGA_STATUS_1_VSY) == 0) S3_RETRACE_LOOP_CHECK; \ while (s3GetImm(s3vga, s3_vertical_sync_active) == 0) S3_RETRACE_LOOP_CHECK; \
} }
/* /*
* Wait for the begining of the retrace interval * Wait for the begining of the retrace interval
*/ */
#define _s3WaitVRetraceEnd(s3) { \ #define _s3WaitVRetraceEnd(s3vga) { \
VOL8 *_status = &s3->crt_vga_status_1; \
int _loop_count; \ int _loop_count; \
DRAW_DEBUG ((DEBUG_CRTC, "_s3WaitVRetraceEnd 0x%x", *_status)); \
_loop_count = 0; \ _loop_count = 0; \
while ((*_status & VGA_STATUS_1_VSY) == 0) S3_RETRACE_LOOP_CHECK; \ while (s3GetImm(s3vga, s3_vertical_sync_active) == 0) S3_RETRACE_LOOP_CHECK; \
_loop_count = 0; \ _loop_count = 0; \
while ((*_status & VGA_STATUS_1_VSY) != 0) S3_RETRACE_LOOP_CHECK; \ while (s3GetImm(s3vga, s3_vertical_sync_active) != 0) S3_RETRACE_LOOP_CHECK; \
} }
#define S3_CURSOR_WIDTH 64 #define S3_CURSOR_WIDTH 64
@ -516,30 +556,4 @@ extern KdCardFuncs s3Funcs;
#define S3_TILE_SIZE 8 #define S3_TILE_SIZE 8
/*
* Ok, so the S3 is broken -- it expects bitmaps to come MSB bit order,
* but it's willing to take them in LSB byte order. These macros
* flip bits around without flipping bytes. Instead of using a table
* and burning memory bandwidth, do them in place with the CPU.
*/
/* The MIPS compiler automatically places these constants in registers */
#define S3InvertBits32(v) { \
v = ((v & 0x55555555) << 1) | ((v >> 1) & 0x55555555); \
v = ((v & 0x33333333) << 2) | ((v >> 2) & 0x33333333); \
v = ((v & 0x0f0f0f0f) << 4) | ((v >> 4) & 0x0f0f0f0f); \
}
#define S3InvertBits16(v) { \
v = ((v & 0x5555) << 1) | ((v >> 1) & 0x5555); \
v = ((v & 0x3333) << 2) | ((v >> 2) & 0x3333); \
v = ((v & 0x0f0f) << 4) | ((v >> 4) & 0x0f0f); \
}
#define S3InvertBits8(v) { \
v = ((v & 0x55) << 1) | ((v >> 1) & 0x55); \
v = ((v & 0x33) << 2) | ((v >> 2) & 0x33); \
v = ((v & 0x0f) << 4) | ((v >> 4) & 0x0f); \
}
#endif /* _S3_H_ */ #endif /* _S3_H_ */

View File

@ -22,7 +22,7 @@
* *
* Author: Keith Packard, SuSE, Inc. * Author: Keith Packard, SuSE, Inc.
*/ */
/* $XFree86: $ */ /* $XFree86: xc/programs/Xserver/hw/kdrive/savage/s3clock.c,v 1.1 1999/11/19 13:53:55 hohndel Exp $ */
#include "s3.h" #include "s3.h"
@ -57,7 +57,7 @@ s3GetClock (int target, int *Mp, int *Np, int *Rp, int maxM, int maxN, int maxR)
for (R = 0; R <= maxR; R++) for (R = 0; R <= maxR; R++)
{ {
f_vco = target * (1 << R); f_vco = target * (1 << R);
if (MIN_VCO <= f_vco && f_vco < MAX_VCO) if (f_vco >= MIN_VCO)
break; break;
} }

View File

@ -22,7 +22,7 @@
* *
* Author: Keith Packard, SuSE, Inc. * Author: Keith Packard, SuSE, Inc.
*/ */
/* $XFree86: $ */ /* $XFree86: xc/programs/Xserver/hw/kdrive/savage/s3cmap.c,v 1.1 1999/11/19 13:53:55 hohndel Exp $ */
#include "s3.h" #include "s3.h"
@ -31,16 +31,14 @@ s3GetColors (ScreenPtr pScreen, int ndef, xColorItem *pdefs)
{ {
KdScreenPriv(pScreen); KdScreenPriv(pScreen);
s3CardInfo(pScreenPriv); s3CardInfo(pScreenPriv);
S3Ptr s3 = s3c->s3; S3Vga *s3vga = &s3c->s3vga;
VOL8 *dac_rd_ad = &s3->crt_vga_dac_rd_ad;
VOL8 *dac_data = &s3->crt_vga_dac_data;
while (ndef--) while (ndef--)
{ {
*dac_rd_ad = pdefs->pixel; s3SetImm (s3vga, s3_dac_read_index, pdefs->pixel);
pdefs->red = *dac_data << 8; pdefs->red = s3GetImm (s3vga, s3_dac_data) << 8;
pdefs->green = *dac_data << 8; pdefs->green = s3GetImm (s3vga, s3_dac_data) << 8;
pdefs->blue = *dac_data << 8; pdefs->blue = s3GetImm (s3vga, s3_dac_data) << 8;
pdefs++; pdefs++;
} }
} }
@ -50,18 +48,40 @@ s3PutColors (ScreenPtr pScreen, int ndef, xColorItem *pdefs)
{ {
KdScreenPriv(pScreen); KdScreenPriv(pScreen);
s3CardInfo(pScreenPriv); s3CardInfo(pScreenPriv);
S3Ptr s3 = s3c->s3; s3ScreenInfo(pScreenPriv);
VOL8 *dac_wt_ad = &s3->crt_vga_dac_wt_ad; S3Vga *s3vga = &s3c->s3vga;
VOL8 *dac_data = &s3->crt_vga_dac_data; Bool hit_border = FALSE;
Bool check_border = FALSE;
_s3WaitVRetrace (s3); _s3WaitVRetrace (s3vga);
if (pScreenPriv->enabled && s3s->manage_border && !s3s->managing_border)
check_border = TRUE;
while (ndef--) while (ndef--)
{ {
*dac_wt_ad = pdefs->pixel; if (check_border && pdefs->pixel == s3s->border_pixel)
*dac_data = pdefs->red >> 8; {
*dac_data = pdefs->green >> 8; if (pdefs->red || pdefs->green || pdefs->blue)
*dac_data = pdefs->blue >> 8; hit_border = TRUE;
}
s3SetImm (s3vga, s3_dac_write_index, pdefs->pixel);
s3SetImm (s3vga, s3_dac_data, pdefs->red >> 8);
s3SetImm (s3vga, s3_dac_data, pdefs->green >> 8);
s3SetImm (s3vga, s3_dac_data, pdefs->blue >> 8);
pdefs++; pdefs++;
} }
if (hit_border)
{
xColorItem black;
black.red = 0;
black.green = 0;
black.blue = 0;
s3s->managing_border = TRUE;
FakeAllocColor (pScreenPriv->pInstalledmap,
&black);
s3s->border_pixel = black.pixel;
FakeFreeColor (pScreenPriv->pInstalledmap, s3s->border_pixel);
/* s3SetImm (&s3c->s3vga, s3_border_color, (VGA8) s3s->border_pixel); */
}
} }

View File

@ -22,9 +22,10 @@
* *
* Author: Keith Packard, SuSE, Inc. * Author: Keith Packard, SuSE, Inc.
*/ */
/* $XFree86: $ */ /* $XFree86: xc/programs/Xserver/hw/kdrive/savage/s3curs.c,v 1.1 1999/11/19 13:53:56 hohndel Exp $ */
#include "s3.h" #include "s3.h"
#include "s3draw.h"
#include "cursorstr.h" #include "cursorstr.h"
#define SetupCursor(s) KdScreenPriv(s); \ #define SetupCursor(s) KdScreenPriv(s); \
@ -94,33 +95,9 @@ s3AllocCursorColors (ScreenPtr pScreen)
{ {
SetupCursor (pScreen); SetupCursor (pScreen);
CursorPtr pCursor = pCurPriv->pCursor; CursorPtr pCursor = pCurPriv->pCursor;
xColorItem sourceColor, maskColor;
/* KdAllocateCursorPixels (pScreen, pCursor,
* Set these to an invalid pixel value so that &pCurPriv->source, &pCurPriv->mask);
* when the store colors comes through, the cursor
* won't get recolored
*/
pCurPriv->source = ~0;
pCurPriv->mask = ~0;
/*
* XXX S3 bug workaround; s3 chip doesn't use RGB values from
* the cursor color registers as documented, rather it uses
* them to index the DAC. This is in the errata though.
*/
sourceColor.red = pCursor->foreRed;
sourceColor.green = pCursor->foreGreen;
sourceColor.blue = pCursor->foreBlue;
FakeAllocColor(pScreenPriv->pInstalledmap, &sourceColor);
maskColor.red = pCursor->backRed;
maskColor.green = pCursor->backGreen;
maskColor.blue = pCursor->backBlue;
FakeAllocColor(pScreenPriv->pInstalledmap, &maskColor);
FakeFreeColor(pScreenPriv->pInstalledmap, sourceColor.pixel);
FakeFreeColor(pScreenPriv->pInstalledmap, maskColor.pixel);
pCurPriv->source = sourceColor.pixel;
pCurPriv->mask = maskColor.pixel;
switch (pScreenPriv->screen->bitsPerPixel) { switch (pScreenPriv->screen->bitsPerPixel) {
case 4: case 4:
pCurPriv->source |= pCurPriv->source << 4; pCurPriv->source |= pCurPriv->source << 4;
@ -190,8 +167,9 @@ s3LoadCursor (ScreenPtr pScreen, int x, int y)
CursorBitsPtr bits = pCursor->bits; CursorBitsPtr bits = pCursor->bits;
int w, h; int w, h;
unsigned char r[2], g[2], b[2]; unsigned char r[2], g[2], b[2];
unsigned short *ram, *msk, *mskLine, *src, *srcLine; unsigned long *ram;
unsigned short and, xor; unsigned long *msk, *mskLine, *src, *srcLine;
unsigned long and, xor;
int i, j; int i, j;
int cursor_address; int cursor_address;
int wsrc; int wsrc;
@ -209,24 +187,24 @@ s3LoadCursor (ScreenPtr pScreen, int x, int y)
/* /*
* Stick new image into cursor memory * Stick new image into cursor memory
*/ */
ram = (unsigned short *) s3s->cursor_base; ram = (unsigned long *) s3s->cursor_base;
mskLine = (unsigned short *) bits->mask; mskLine = (unsigned long *) bits->mask;
srcLine = (unsigned short *) bits->source; srcLine = (unsigned long *) bits->source;
h = bits->height; h = bits->height;
if (h > S3_CURSOR_HEIGHT) if (h > S3_CURSOR_HEIGHT)
h = S3_CURSOR_HEIGHT; h = S3_CURSOR_HEIGHT;
wsrc = BitmapBytePad(bits->width) / 2; /* words per line */ wsrc = BitmapBytePad(bits->width) / 4; /* ulongs per line */
for (i = 0; i < S3_CURSOR_HEIGHT; i++) { for (i = 0; i < S3_CURSOR_HEIGHT; i++) {
msk = mskLine; msk = mskLine;
src = srcLine; src = srcLine;
mskLine += wsrc; mskLine += wsrc;
srcLine += wsrc; srcLine += wsrc;
for (j = 0; j < S3_CURSOR_WIDTH / 16; j++) { for (j = 0; j < S3_CURSOR_WIDTH / 32; j++) {
unsigned short m, s; unsigned long m, s;
if (i < h && j < wsrc) if (i < h && j < wsrc)
{ {
@ -237,14 +215,14 @@ s3LoadCursor (ScreenPtr pScreen, int x, int y)
} }
else else
{ {
and = 0xffff; and = 0xffffffff;
xor = 0x0000; xor = 0x00000000;
} }
S3InvertBits16(and); S3AdjustBits32(and);
*ram++ = and; S3AdjustBits32(xor);
S3InvertBits16(xor); *ram++ = (and & 0xffff) | (xor << 16);
*ram++ = xor; *ram++ = (and >> 16) | (xor & 0xffff0000);
} }
} }
@ -254,10 +232,11 @@ s3LoadCursor (ScreenPtr pScreen, int x, int y)
_s3SetCursorColors (pScreen); _s3SetCursorColors (pScreen);
/* Enable the cursor */ /* Enable the cursor */
s3SetImm (s3vga, s3_cursor_ms_x11, 0);
s3SetImm (s3vga, s3_cursor_enable, 1); s3SetImm (s3vga, s3_cursor_enable, 1);
/* Wait for VRetrace to make sure the position is read */ /* Wait for VRetrace to make sure the position is read */
_s3WaitVRetrace (s3); _s3WaitVRetrace (s3vga);
/* Move to new position */ /* Move to new position */
_s3MoveCursor (pScreen, x, y); _s3MoveCursor (pScreen, x, y);
@ -285,7 +264,11 @@ s3RealizeCursor (ScreenPtr pScreen, CursorPtr pCursor)
{ {
if (pCursor) if (pCursor)
{ {
int x, y; #ifdef FB_OLD_SCREEN
short x, y;
#else
int x, y;
#endif
miPointerPosition (&x, &y); miPointerPosition (&x, &y);
s3LoadCursor (pScreen, x, y); s3LoadCursor (pScreen, x, y);
@ -382,7 +365,11 @@ s3CursorEnable (ScreenPtr pScreen)
{ {
if (pCurPriv->pCursor) if (pCurPriv->pCursor)
{ {
int x, y; #ifdef FB_OLD_SCREEN
short x, y;
#else
int x, y;
#endif
miPointerPosition (&x, &y); miPointerPosition (&x, &y);
s3LoadCursor (pScreen, x, y); s3LoadCursor (pScreen, x, y);

View File

@ -22,7 +22,7 @@
* *
* Author: Keith Packard, SuSE, Inc. * Author: Keith Packard, SuSE, Inc.
*/ */
/* $XFree86: $ */ /* $XFree86: xc/programs/Xserver/hw/kdrive/savage/s3draw.c,v 1.1 1999/11/19 13:53:56 hohndel Exp $ */
#include "s3.h" #include "s3.h"
#include "s3draw.h" #include "s3draw.h"
@ -69,12 +69,12 @@ short s3alu[16] = {
#define BURST #define BURST
#ifdef BURST #ifdef BURST
#define PixTransDeclare VOL32 *pix_trans_base = (VOL32 *) (s3c->registers),\ #define PixTransDeclare VOL32 *pix_trans_base = (VOL32 *) (s3c->registers),\
*pix_trans = pix_trans_base; *pix_trans = pix_trans_base
#define PixTransStart(n) if (pix_trans + (n) > pix_trans_base + 8192) pix_trans = pix_trans_base; #define PixTransStart(n) if (pix_trans + (n) > pix_trans_base + 8192) pix_trans = pix_trans_base
#define PixTransStore(t) *pix_trans++ = (t) #define PixTransStore(t) *pix_trans++ = (t)
#else #else
#define PixTransDeclare VOL32 *pix_trans = &s3->pix_trans; #define PixTransDeclare VOL32 *pix_trans = &s3->pix_trans
#define PixTransStart(n) #define PixTransStart(n)
#define PixTransStore(t) *pix_trans = (t) #define PixTransStore(t) *pix_trans = (t)
#endif #endif
@ -147,14 +147,14 @@ s3CopyNtoN (DrawablePtr pSrcDrawable,
_s3Blt (s3, srcX, srcY, dstX, dstY, w, h, flags); _s3Blt (s3, srcX, srcY, dstX, dstY, w, h, flags);
pbox++; pbox++;
} }
_s3WaitIdleEmpty(s3); MarkSyncS3 (pSrcDrawable->pScreen);
} }
RegionPtr RegionPtr
s3CopyArea(DrawablePtr pSrcDrawable, DrawablePtr pDstDrawable, GCPtr pGC, s3CopyArea(DrawablePtr pSrcDrawable, DrawablePtr pDstDrawable, GCPtr pGC,
int srcx, int srcy, int width, int height, int dstx, int dsty) int srcx, int srcy, int width, int height, int dstx, int dsty)
{ {
KdScreenPriv(pDstDrawable->pScreen); SetupS3(pDstDrawable->pScreen);
if (pSrcDrawable->type == DRAWABLE_WINDOW && if (pSrcDrawable->type == DRAWABLE_WINDOW &&
pDstDrawable->type == DRAWABLE_WINDOW) pDstDrawable->type == DRAWABLE_WINDOW)
@ -163,12 +163,13 @@ s3CopyArea(DrawablePtr pSrcDrawable, DrawablePtr pDstDrawable, GCPtr pGC,
srcx, srcy, width, height, srcx, srcy, width, height,
dstx, dsty, s3CopyNtoN, 0, 0); dstx, dsty, s3CopyNtoN, 0, 0);
} }
return fbCopyArea (pSrcDrawable, pDstDrawable, pGC, return KdCheckCopyArea (pSrcDrawable, pDstDrawable, pGC,
srcx, srcy, width, height, dstx, dsty); srcx, srcy, width, height, dstx, dsty);
} }
typedef struct _s31toNargs { typedef struct _s31toNargs {
unsigned long copyPlaneFG, copyPlaneBG; unsigned long copyPlaneFG, copyPlaneBG;
Bool opaque;
} s31toNargs; } s31toNargs;
void void
@ -209,7 +210,7 @@ _s3Stipple (S3CardInfo *s3c,
while (nl--) while (nl--)
{ {
tmp = *psrc++; tmp = *psrc++;
S3InvertBits32(tmp); S3AdjustBits32 (tmp);
PixTransStore (tmp); PixTransStore (tmp);
} }
psrc += widthRest; psrc += widthRest;
@ -228,7 +229,7 @@ _s3Stipple (S3CardInfo *s3c,
tmp = FbStipLeft(bits, leftShift); tmp = FbStipLeft(bits, leftShift);
bits = *psrc++; bits = *psrc++;
tmp |= FbStipRight(bits, rightShift); tmp |= FbStipRight(bits, rightShift);
S3InvertBits32(tmp); S3AdjustBits32(tmp);
PixTransStore (tmp); PixTransStore (tmp);
} }
psrc += widthRest; psrc += widthRest;
@ -257,7 +258,7 @@ s3Copy1toN (DrawablePtr pSrcDrawable,
FbStride widthSrc; FbStride widthSrc;
int srcBpp; int srcBpp;
if (sourceInvarient (pGC->alu)) if (args->opaque && sourceInvarient (pGC->alu))
{ {
s3FillBoxSolid (pDstDrawable, nbox, pbox, s3FillBoxSolid (pDstDrawable, nbox, pbox,
pGC->bgPixel, pGC->alu, pGC->planemask); pGC->bgPixel, pGC->alu, pGC->planemask);
@ -266,8 +267,16 @@ s3Copy1toN (DrawablePtr pSrcDrawable,
fbGetStipDrawable (pSrcDrawable, psrcBase, widthSrc, srcBpp); fbGetStipDrawable (pSrcDrawable, psrcBase, widthSrc, srcBpp);
_s3SetOpaquePlaneBlt(s3,pGC->alu,pGC->planemask,args->copyPlaneFG, if (args->opaque)
args->copyPlaneBG); {
_s3SetOpaquePlaneBlt(s3,pGC->alu,pGC->planemask,args->copyPlaneFG,
args->copyPlaneBG);
}
else
{
_s3SetTransparentPlaneBlt (s3, pGC->alu,
pGC->planemask, args->copyPlaneFG);
}
while (nbox--) while (nbox--)
{ {
@ -281,7 +290,7 @@ s3Copy1toN (DrawablePtr pSrcDrawable,
pbox->x2 - dstx, pbox->y2 - dsty); pbox->x2 - dstx, pbox->y2 - dsty);
pbox++; pbox++;
} }
_s3WaitIdleEmpty (s3); MarkSyncS3 (pDstDrawable->pScreen);
} }
RegionPtr RegionPtr
@ -289,7 +298,7 @@ s3CopyPlane(DrawablePtr pSrcDrawable, DrawablePtr pDstDrawable, GCPtr pGC,
int srcx, int srcy, int width, int height, int srcx, int srcy, int width, int height,
int dstx, int dsty, unsigned long bitPlane) int dstx, int dsty, unsigned long bitPlane)
{ {
KdScreenPriv (pDstDrawable->pScreen); SetupS3 (pDstDrawable->pScreen);
RegionPtr ret; RegionPtr ret;
s31toNargs args; s31toNargs args;
@ -298,13 +307,35 @@ s3CopyPlane(DrawablePtr pSrcDrawable, DrawablePtr pDstDrawable, GCPtr pGC,
{ {
args.copyPlaneFG = pGC->fgPixel; args.copyPlaneFG = pGC->fgPixel;
args.copyPlaneBG = pGC->bgPixel; args.copyPlaneBG = pGC->bgPixel;
args.opaque = TRUE;
return fbDoCopy (pSrcDrawable, pDstDrawable, pGC, return fbDoCopy (pSrcDrawable, pDstDrawable, pGC,
srcx, srcy, width, height, srcx, srcy, width, height,
dstx, dsty, s3Copy1toN, bitPlane, &args); dstx, dsty, s3Copy1toN, bitPlane, &args);
} }
return fbCopyPlane(pSrcDrawable, pDstDrawable, pGC, return KdCheckCopyPlane(pSrcDrawable, pDstDrawable, pGC,
srcx, srcy, width, height, srcx, srcy, width, height,
dstx, dsty, bitPlane); dstx, dsty, bitPlane);
}
void
s3PushPixels (GCPtr pGC, PixmapPtr pBitmap,
DrawablePtr pDrawable,
int w, int h, int x, int y)
{
SetupS3 (pDrawable->pScreen);
s31toNargs args;
if (pDrawable->type == DRAWABLE_WINDOW && pGC->fillStyle == FillSolid)
{
args.opaque = FALSE;
args.copyPlaneFG = pGC->fgPixel;
(void) fbDoCopy ((DrawablePtr) pBitmap, pDrawable, pGC,
0, 0, w, h, x, y, s3Copy1toN, 1, &args);
}
else
{
KdCheckPushPixels (pGC, pBitmap, pDrawable, w, h, x, y);
}
} }
void void
@ -320,7 +351,7 @@ s3FillBoxSolid (DrawablePtr pDrawable, int nBox, BoxPtr pBox,
_s3SolidRect(s3,pBox->x1,pBox->y1,pBox->x2-pBox->x1,pBox->y2-pBox->y1); _s3SolidRect(s3,pBox->x1,pBox->y1,pBox->x2-pBox->x1,pBox->y2-pBox->y1);
pBox++; pBox++;
} }
_s3WaitIdleEmpty(s3); MarkSyncS3 (pDrawable->pScreen);
} }
void void
@ -363,7 +394,7 @@ s3FillBoxPattern (DrawablePtr pDrawable, int nBox, BoxPtr pBox,
pBox->x2-pBox->x1, pBox->y2-pBox->y1); pBox->x2-pBox->x1, pBox->y2-pBox->y1);
pBox++; pBox++;
} }
_s3WaitIdleEmpty(s3); MarkSyncS3 (pDrawable->pScreen);
} }
void void
@ -438,7 +469,7 @@ s3FillBoxLargeStipple (DrawablePtr pDrawable, GCPtr pGC,
stipY = 0; stipY = 0;
} }
} }
_s3WaitIdleEmpty (s3); MarkSyncS3 (pDrawable->pScreen);
} }
#define NUM_STACK_RECTS 1024 #define NUM_STACK_RECTS 1024
@ -669,7 +700,7 @@ s3FillSpans (DrawablePtr pDrawable, GCPtr pGC, int n,
{ {
s3GCPrivate(pGC); s3GCPrivate(pGC);
SetupS3(pDrawable->pScreen); SetupS3(pDrawable->pScreen);
int x, y; int x, y, x1, y1, x2, y2;
int width; int width;
/* next three parameters are post-clip */ /* next three parameters are post-clip */
int nTmp; int nTmp;
@ -678,60 +709,113 @@ s3FillSpans (DrawablePtr pDrawable, GCPtr pGC, int n,
FbGCPrivPtr fbPriv = fbGetGCPrivate(pGC); FbGCPrivPtr fbPriv = fbGetGCPrivate(pGC);
BoxPtr extents; BoxPtr extents;
S3PatternCache *cache; S3PatternCache *cache;
RegionPtr pClip = fbGetCompositeClip (pGC);
nTmp = n * miFindMaxBand(fbGetCompositeClip(pGC)); if (REGION_NUM_RECTS(pClip) == 1 &&
pwidthFree = (int *)ALLOCATE_LOCAL(nTmp * sizeof(int)); (pGC->fillStyle == FillSolid || s3Priv->pPattern))
pptFree = (DDXPointRec *)ALLOCATE_LOCAL(nTmp * sizeof(DDXPointRec));
if(!pptFree || !pwidthFree)
{ {
if (pptFree) DEALLOCATE_LOCAL(pptFree); extents = REGION_RECTS(pClip);
if (pwidthFree) DEALLOCATE_LOCAL(pwidthFree); x1 = extents->x1;
return; x2 = extents->x2;
} y1 = extents->y1;
n = miClipSpans(fbGetCompositeClip(pGC), y2 = extents->y2;
ppt, pwidth, n, if (pGC->fillStyle == FillSolid)
pptFree, pwidthFree, fSorted);
pwidth = pwidthFree;
ppt = pptFree;
if (pGC->fillStyle == FillSolid)
{
_s3SetSolidFill(s3,pGC->fgPixel,pGC->alu,pGC->planemask);
while (n--)
{ {
x = ppt->x; _s3SetSolidFill(s3,pGC->fgPixel,pGC->alu,pGC->planemask);
y = ppt->y; cache = 0;
ppt++; }
width = *pwidth++; else
if (width) {
{ _s3SetPattern (pDrawable->pScreen, pGC->alu, pGC->planemask,
_s3SolidRect(s3,x,y,width,1); s3Priv->pPattern);
} cache = s3Priv->pPattern->cache;
} }
}
else if (s3Priv->pPattern)
{
_s3SetPattern (pDrawable->pScreen, pGC->alu, pGC->planemask,
s3Priv->pPattern);
cache = s3Priv->pPattern->cache;
while (n--) while (n--)
{ {
x = ppt->x;
y = ppt->y; y = ppt->y;
ppt++; if (y1 <= y && y < y2)
width = *pwidth++;
if (width)
{ {
_s3PatRect(s3, cache->x, cache->y, x, y, width, 1); x = ppt->x;
width = *pwidth;
if (x < x1)
{
width -= (x1 - x);
x = x1;
}
if (x2 < x + width)
width = x2 - x;
if (width > 0)
{
if (cache)
{
_s3PatRect(s3, cache->x, cache->y, x, y, width, 1);
}
else
{
_s3SolidRect(s3,x,y,width,1);
}
}
} }
ppt++;
pwidth++;
} }
} }
else else
{ {
_s3FillSpanLargeStipple (pDrawable, pGC, n, ppt, pwidth); nTmp = n * miFindMaxBand(pClip);
pwidthFree = (int *)ALLOCATE_LOCAL(nTmp * sizeof(int));
pptFree = (DDXPointRec *)ALLOCATE_LOCAL(nTmp * sizeof(DDXPointRec));
if(!pptFree || !pwidthFree)
{
if (pptFree) DEALLOCATE_LOCAL(pptFree);
if (pwidthFree) DEALLOCATE_LOCAL(pwidthFree);
return;
}
n = miClipSpans(fbGetCompositeClip(pGC),
ppt, pwidth, n,
pptFree, pwidthFree, fSorted);
pwidth = pwidthFree;
ppt = pptFree;
if (pGC->fillStyle == FillSolid)
{
_s3SetSolidFill(s3,pGC->fgPixel,pGC->alu,pGC->planemask);
while (n--)
{
x = ppt->x;
y = ppt->y;
ppt++;
width = *pwidth++;
if (width)
{
_s3SolidRect(s3,x,y,width,1);
}
}
}
else if (s3Priv->pPattern)
{
_s3SetPattern (pDrawable->pScreen, pGC->alu, pGC->planemask,
s3Priv->pPattern);
cache = s3Priv->pPattern->cache;
while (n--)
{
x = ppt->x;
y = ppt->y;
ppt++;
width = *pwidth++;
if (width)
{
_s3PatRect(s3, cache->x, cache->y, x, y, width, 1);
}
}
}
else
{
_s3FillSpanLargeStipple (pDrawable, pGC, n, ppt, pwidth);
}
DEALLOCATE_LOCAL(pptFree);
DEALLOCATE_LOCAL(pwidthFree);
} }
_s3WaitIdleEmpty (s3); MarkSyncS3 (pDrawable->pScreen);
DEALLOCATE_LOCAL(pptFree);
DEALLOCATE_LOCAL(pwidthFree);
} }
#include "mifillarc.h" #include "mifillarc.h"
@ -886,14 +970,14 @@ s3PolyFillArcSolid (DrawablePtr pDraw, GCPtr pGC, int narcs, xArc *parcs)
} }
if (set) if (set)
{ {
_s3WaitIdleEmpty(s3); MarkSyncS3 (pDraw->pScreen);
set = FALSE; set = FALSE;
} }
miPolyFillArc(pDraw, pGC, 1, parcs); KdCheckPolyFillArc(pDraw, pGC, 1, parcs);
} }
if (set) if (set)
{ {
_s3WaitIdleEmpty(s3); MarkSyncS3 (pDraw->pScreen);
set = FALSE; set = FALSE;
} }
} }
@ -925,7 +1009,7 @@ s3FillPoly1Rect (DrawablePtr pDrawable, GCPtr pGC, int shape,
if (mode == CoordModePrevious) if (mode == CoordModePrevious)
{ {
miFillPolygon (pDrawable, pGC, shape, mode, countInit, ptsIn); KdCheckFillPolygon (pDrawable, pGC, shape, mode, countInit, ptsIn);
return; return;
} }
@ -949,7 +1033,7 @@ s3FillPoly1Rect (DrawablePtr pDrawable, GCPtr pGC, int shape,
*/ */
if (c & 0xe000e000) if (c & 0xe000e000)
{ {
miFillPolygon (pDrawable, pGC, shape, mode, countInit, ptsIn); KdCheckFillPolygon (pDrawable, pGC, shape, mode, countInit, ptsIn);
return; return;
} }
c = intToY(c); c = intToY(c);
@ -979,7 +1063,7 @@ s3FillPoly1Rect (DrawablePtr pDrawable, GCPtr pGC, int shape,
*/ */
if (c & 0xe000e000) if (c & 0xe000e000)
{ {
miFillPolygon (pDrawable, pGC, shape, mode, countInit, ptsIn); KdCheckFillPolygon (pDrawable, pGC, shape, mode, countInit, ptsIn);
return; return;
} }
c = intToY(c); c = intToY(c);
@ -1016,7 +1100,7 @@ s3FillPoly1Rect (DrawablePtr pDrawable, GCPtr pGC, int shape,
yFlip++; yFlip++;
if (yFlip != 2) if (yFlip != 2)
{ {
miFillPolygon (pDrawable, pGC, shape, mode, countInit, ptsIn); KdCheckFillPolygon (pDrawable, pGC, shape, mode, countInit, ptsIn);
return; return;
} }
} }
@ -1141,7 +1225,7 @@ s3FillPoly1Rect (DrawablePtr pDrawable, GCPtr pGC, int shape,
break; break;
} }
_s3ResetClip (s3, pDrawable->pScreen); _s3ResetClip (s3, pDrawable->pScreen);
_s3WaitIdleEmpty(s3); MarkSyncS3 (pDrawable->pScreen);
} }
void void
@ -1171,7 +1255,7 @@ s3PolyGlyphBltClipped (DrawablePtr pDrawable,
int nbox; int nbox;
int x1, y1, x2, y2; int x1, y1, x2, y2;
unsigned char alu; unsigned char alu;
Bool locked; Bool set;
PixTransDeclare; PixTransDeclare;
x += pDrawable->x; x += pDrawable->x;
@ -1229,10 +1313,10 @@ s3PolyGlyphBltClipped (DrawablePtr pDrawable,
_s3SolidRect (s3, x1, y1, x2 - x1, y2 - y1); _s3SolidRect (s3, x1, y1, x2 - x1, y2 - y1);
} }
} }
MarkSyncS3 (pDrawable->pScreen);
} }
_s3SetTransparentPlaneBlt (s3, alu, pGC->planemask, pGC->fgPixel);
ppci = ppciInit; ppci = ppciInit;
locked = TRUE; set = FALSE;
while (nglyph--) while (nglyph--)
{ {
pci = *ppci++; pci = *ppci++;
@ -1247,13 +1331,14 @@ s3PolyGlyphBltClipped (DrawablePtr pDrawable,
switch (RECT_IN_REGION(pGC->pScreen, pClip, &bbox)) switch (RECT_IN_REGION(pGC->pScreen, pClip, &bbox))
{ {
case rgnIN: case rgnIN:
#if 1
lw = h * ((w + 31) >> 5); lw = h * ((w + 31) >> 5);
if (lw) if (lw)
{ {
if (!locked) if (!set)
{ {
_s3SetTransparentPlaneBlt (s3, alu, pGC->planemask, pGC->fgPixel); _s3SetTransparentPlaneBlt (s3, alu, pGC->planemask, pGC->fgPixel);
locked = TRUE; set = TRUE;
} }
_s3PlaneBlt(s3, _s3PlaneBlt(s3,
x + pci->metrics.leftSideBearing, x + pci->metrics.leftSideBearing,
@ -1264,17 +1349,16 @@ s3PolyGlyphBltClipped (DrawablePtr pDrawable,
while (lw--) while (lw--)
{ {
b = *bits++; b = *bits++;
S3InvertBits32 (b); S3AdjustBits32 (b);
PixTransStore(b); PixTransStore(b);
} }
MarkSyncS3 (pDrawable->pScreen);
} }
break; break;
#endif
case rgnPART: case rgnPART:
if (locked) set = FALSE;
{ CheckSyncS3 (pDrawable->pScreen);
_s3WaitIdleEmpty(s3);
locked = FALSE;
}
fbPutXYImage (pDrawable, fbPutXYImage (pDrawable,
pClip, pClip,
fbPriv->fg, fbPriv->fg,
@ -1293,7 +1377,6 @@ s3PolyGlyphBltClipped (DrawablePtr pDrawable,
} }
x += pci->metrics.characterWidth; x += pci->metrics.characterWidth;
} }
_s3WaitIdleEmpty(s3);
} }
/* /*
@ -1422,13 +1505,13 @@ s3PolyGlyphBlt (DrawablePtr pDrawable,
while (lw--) while (lw--)
{ {
b = *bits++; b = *bits++;
S3InvertBits32 (b); S3AdjustBits32 (b);
PixTransStore(b); PixTransStore(b);
} }
} }
x += pci->metrics.characterWidth; x += pci->metrics.characterWidth;
} }
_s3WaitIdleEmpty(s3); MarkSyncS3 (pDrawable->pScreen);
} }
void void
@ -1487,6 +1570,8 @@ s3ImageTEGlyphBlt (DrawablePtr pDrawable, GCPtr pGC,
switch (RECT_IN_REGION(pGC->pScreen, fbGetCompositeClip(pGC), &bbox)) switch (RECT_IN_REGION(pGC->pScreen, fbGetCompositeClip(pGC), &bbox))
{ {
case rgnIN:
break;
case rgnPART: case rgnPART:
if (pglyphBase == (pointer) 1) if (pglyphBase == (pointer) 1)
pglyphBase = 0; pglyphBase = 0;
@ -1510,6 +1595,12 @@ s3ImageTEGlyphBlt (DrawablePtr pDrawable, GCPtr pGC,
_s3SetOpaquePlaneBlt (s3, GXcopy, pGC->planemask, pGC->fgPixel, pGC->bgPixel); _s3SetOpaquePlaneBlt (s3, GXcopy, pGC->planemask, pGC->fgPixel, pGC->bgPixel);
} }
#if BITMAP_BIT_ORDER == LSBFirst
#define SHIFT <<
#else
#define SHIFT >>
#endif
#define LoopIt(count, w, loadup, fetch) \ #define LoopIt(count, w, loadup, fetch) \
while (nglyph >= count) \ while (nglyph >= count) \
{ \ { \
@ -1521,7 +1612,7 @@ s3ImageTEGlyphBlt (DrawablePtr pDrawable, GCPtr pGC,
PixTransStart(h); \ PixTransStart(h); \
while (lwTmp--) { \ while (lwTmp--) { \
tmp = fetch; \ tmp = fetch; \
S3InvertBits32(tmp); \ S3AdjustBits32(tmp); \
PixTransStore(tmp); \ PixTransStore(tmp); \
} \ } \
} }
@ -1535,9 +1626,9 @@ s3ImageTEGlyphBlt (DrawablePtr pDrawable, GCPtr pGC,
char3 = (unsigned long *) (*ppci++)->bits; char3 = (unsigned long *) (*ppci++)->bits;
char4 = (unsigned long *) (*ppci++)->bits;, char4 = (unsigned long *) (*ppci++)->bits;,
(*char1++ | ((*char2++ | ((*char3++ | (*char4++ (*char1++ | ((*char2++ | ((*char3++ | (*char4++
<< widthGlyph)) SHIFT widthGlyph))
<< widthGlyph)) SHIFT widthGlyph))
<< widthGlyph))) SHIFT widthGlyph)))
} }
else if (widthGlyph <= 10) else if (widthGlyph <= 10)
{ {
@ -1546,7 +1637,7 @@ s3ImageTEGlyphBlt (DrawablePtr pDrawable, GCPtr pGC,
char1 = (unsigned long *) (*ppci++)->bits; char1 = (unsigned long *) (*ppci++)->bits;
char2 = (unsigned long *) (*ppci++)->bits; char2 = (unsigned long *) (*ppci++)->bits;
char3 = (unsigned long *) (*ppci++)->bits;, char3 = (unsigned long *) (*ppci++)->bits;,
(*char1++ | ((*char2++ | (*char3++ << widthGlyph)) << widthGlyph))) (*char1++ | ((*char2++ | (*char3++ SHIFT widthGlyph)) SHIFT widthGlyph)))
} }
else if (widthGlyph <= 16) else if (widthGlyph <= 16)
{ {
@ -1554,7 +1645,7 @@ s3ImageTEGlyphBlt (DrawablePtr pDrawable, GCPtr pGC,
LoopIt(2, widthGlyphs, LoopIt(2, widthGlyphs,
char1 = (unsigned long *) (*ppci++)->bits; char1 = (unsigned long *) (*ppci++)->bits;
char2 = (unsigned long *) (*ppci++)->bits;, char2 = (unsigned long *) (*ppci++)->bits;,
(*char1++ | (*char2++ << widthGlyph))) (*char1++ | (*char2++ SHIFT widthGlyph)))
} }
lw = h * ((widthGlyph + 31) >> 5); lw = h * ((widthGlyph + 31) >> 5);
while (nglyph--) while (nglyph--)
@ -1567,11 +1658,11 @@ s3ImageTEGlyphBlt (DrawablePtr pDrawable, GCPtr pGC,
while (lwTmp--) while (lwTmp--)
{ {
tmp = *char1++; tmp = *char1++;
S3InvertBits32(tmp); S3AdjustBits32(tmp);
PixTransStore(tmp); PixTransStore(tmp);
} }
} }
_s3WaitIdleEmpty (s3); MarkSyncS3 (pDrawable->pScreen);
} }
void void
@ -1583,15 +1674,6 @@ s3PolyTEGlyphBlt (DrawablePtr pDrawable, GCPtr pGC,
s3ImageTEGlyphBlt (pDrawable, pGC, x, y, nglyph, ppci, (pointer) 1); s3ImageTEGlyphBlt (pDrawable, pGC, x, y, nglyph, ppci, (pointer) 1);
} }
#define _s3ClipLine(s3,cmd,e1,e2,e,len) {\
DRAW_DEBUG ((DEBUG_RENDER, "clip line 0x%x 0x%x 0x%x 0x%x 0x%x", cmd,e1,e2,e,len)); \
_s3CmdWait(s3); \
_s3SetPcnt (s3, (len), 0); \
_s3SetStep (s3, e2, e1); \
_s3SetErr (s3, e); \
_s3SetCmd (s3, CMD_LINE | (cmd) | DRAW | WRTDATA); \
}
void void
_s3Segment (DrawablePtr pDrawable, _s3Segment (DrawablePtr pDrawable,
GCPtr pGC, GCPtr pGC,
@ -1750,7 +1832,7 @@ s3Polylines (DrawablePtr pDrawable, GCPtr pGC,
x = nx; x = nx;
y = ny; y = ny;
} }
_s3WaitIdleEmpty(s3); MarkSyncS3 (pDrawable->pScreen);
} }
void void
@ -1781,7 +1863,7 @@ s3PolySegment (DrawablePtr pDrawable, GCPtr pGC,
pSeg->x2 + ox, pSeg->y2 + oy, drawLast); pSeg->x2 + ox, pSeg->y2 + oy, drawLast);
} }
_s3WaitIdleEmpty(s3); MarkSyncS3 (pDrawable->pScreen);
} }
/* /*
@ -1939,6 +2021,8 @@ _s3PutPattern (ScreenPtr pScreen, s3PatternPtr pPattern)
cache->y * pScreenPriv->screen->byteStride + cache->y * pScreenPriv->screen->byteStride +
cache->x * pScreenPriv->bytesPerPixel); cache->x * pScreenPriv->bytesPerPixel);
CheckSyncS3 (pScreen);
for (y = 0; y < S3_TILE_SIZE; y++) for (y = 0; y < S3_TILE_SIZE; y++)
{ {
switch (pScreenPriv->screen->bitsPerPixel) { switch (pScreenPriv->screen->bitsPerPixel) {
@ -2094,7 +2178,7 @@ s3ChangeWindowAttributes (WindowPtr pWin, Mask mask)
void void
s3PaintWindow(WindowPtr pWin, RegionPtr pRegion, int what) s3PaintWindow(WindowPtr pWin, RegionPtr pRegion, int what)
{ {
KdScreenPriv(pWin->drawable.pScreen); SetupS3(pWin->drawable.pScreen);
s3PatternPtr pPattern; s3PatternPtr pPattern;
DRAW_DEBUG ((DEBUG_PAINT_WINDOW, "s3PaintWindow 0x%x extents %d %d %d %d n %d", DRAW_DEBUG ((DEBUG_PAINT_WINDOW, "s3PaintWindow 0x%x extents %d %d %d %d n %d",
@ -2146,7 +2230,7 @@ s3PaintWindow(WindowPtr pWin, RegionPtr pRegion, int what)
} }
break; break;
} }
fbPaintWindow (pWin, pRegion, what); KdCheckPaintWindow (pWin, pRegion, what);
} }
void void
@ -2198,7 +2282,7 @@ s3CopyWindowProc (DrawablePtr pSrcDrawable,
_s3Blt (s3, srcX, srcY, dstX, dstY, w, h, flags); _s3Blt (s3, srcX, srcY, dstX, dstY, w, h, flags);
pbox++; pbox++;
} }
_s3WaitIdleEmpty(s3); MarkSyncS3 (pDstDrawable->pScreen);
} }
void void
@ -2254,6 +2338,10 @@ s3DrawInit (ScreenPtr pScreen)
return FALSE; return FALSE;
if (!AllocateGCPrivate(pScreen, s3GCPrivateIndex, sizeof (s3PrivGCRec))) if (!AllocateGCPrivate(pScreen, s3GCPrivateIndex, sizeof (s3PrivGCRec)))
return FALSE; return FALSE;
/*
* Hook up asynchronous drawing
*/
RegisterSync (pScreen);
/* /*
* Replace various fb screen functions * Replace various fb screen functions
*/ */
@ -2306,17 +2394,19 @@ s3DrawEnable (ScreenPtr pScreen)
for (c = 0; c < s3s->patterns.ncache; c++) for (c = 0; c < s3s->patterns.ncache; c++)
s3s->patterns.cache[c].id = 0; s3s->patterns.cache[c].id = 0;
_s3WaitIdleEmpty(s3); _s3WaitIdleEmpty (s3);
_s3SetScissorsTl(s3, 0, 0); _s3SetScissorsTl(s3, 0, 0);
_s3SetScissorsBr(s3, pScreenPriv->screen->width - 1, pScreenPriv->screen->height - 1); _s3SetScissorsBr(s3, pScreenPriv->screen->width - 1, pScreenPriv->screen->height - 1);
_s3SetSolidFill(s3, pScreen->blackPixel, GXcopy, ~0); _s3SetSolidFill(s3, pScreen->blackPixel, GXcopy, ~0);
_s3SolidRect (s3, 0, 0, pScreenPriv->screen->width, pScreenPriv->screen->height); _s3SolidRect (s3, 0, 0, pScreenPriv->screen->width, pScreenPriv->screen->height);
_s3WaitIdleEmpty (s3); MarkSyncS3 (pScreen);
} }
void void
s3DrawDisable (ScreenPtr pScreen) s3DrawDisable (ScreenPtr pScreen)
{ {
SetupS3 (pScreen);
_s3WaitIdleEmpty (s3);
} }
void void
@ -2332,3 +2422,11 @@ s3DrawFini (ScreenPtr pScreen)
s3s->patterns.ncache = 0; s3s->patterns.ncache = 0;
} }
} }
void
s3DrawSync (ScreenPtr pScreen)
{
SetupS3(pScreen);
_s3WaitIdleEmpty(s3c->s3);
}

View File

@ -22,7 +22,7 @@
* *
* Author: Keith Packard, SuSE, Inc. * Author: Keith Packard, SuSE, Inc.
*/ */
/* $XFree86: $ */ /* $XFree86: xc/programs/Xserver/hw/kdrive/savage/s3draw.h,v 1.1 1999/11/19 13:53:56 hohndel Exp $ */
#ifndef _S3DRAW_H_ #ifndef _S3DRAW_H_
#define _S3DRAW_H_ #define _S3DRAW_H_
@ -62,9 +62,69 @@ void _s3LoadPattern (ScreenPtr pScreen, s3PatternPtr pPattern);
s3CardInfo(pScreenPriv); \ s3CardInfo(pScreenPriv); \
S3Ptr s3 = s3c->s3 S3Ptr s3 = s3c->s3
#ifdef S3_SYNC_DEBUG
#define SYNC_DEBUG() fprintf (stderr, "Sync at %s:%d\n", __FILE__,__LINE__)
#else
#define SYNC_DEBUG()
#endif
#define S3_ASYNC
#ifdef S3_ASYNC
#define CheckSyncS3(s) KdCheckSync(s)
#define MarkSyncS3(s) KdMarkSync(s)
#define RegisterSync(screen) KdScreenInitAsync (screen)
#else
#define CheckSyncS3(s3c)
#define MarkSyncS3(s3c) _s3WaitIdleEmpty(s3c->s3)
#define RegisterSync(screen)
#endif
#define WIDEN(x) ((unsigned long) (x)) #define WIDEN(x) ((unsigned long) (x))
#define MERGE(a,b) ((WIDEN(a) << 16) | WIDEN(b)) #define MERGE(a,b) ((WIDEN(a) << 16) | WIDEN(b))
/*
* Ok, so the S3 is broken -- it expects bitmaps to come MSB bit order,
* but it's willing to take them in LSB byte order. These macros
* flip bits around without flipping bytes. Instead of using a table
* and burning memory bandwidth, do them in place with the CPU.
*/
/* The MIPS compiler automatically places these constants in registers */
#define S3InvertBits32(v) { \
v = ((v & 0x55555555) << 1) | ((v >> 1) & 0x55555555); \
v = ((v & 0x33333333) << 2) | ((v >> 2) & 0x33333333); \
v = ((v & 0x0f0f0f0f) << 4) | ((v >> 4) & 0x0f0f0f0f); \
}
#define S3InvertBits16(v) { \
v = ((v & 0x5555) << 1) | ((v >> 1) & 0x5555); \
v = ((v & 0x3333) << 2) | ((v >> 2) & 0x3333); \
v = ((v & 0x0f0f) << 4) | ((v >> 4) & 0x0f0f); \
}
#define S3InvertBits8(v) { \
v = ((v & 0x55) << 1) | ((v >> 1) & 0x55); \
v = ((v & 0x33) << 2) | ((v >> 2) & 0x33); \
v = ((v & 0x0f) << 4) | ((v >> 4) & 0x0f); \
}
#define S3ByteSwap32(x) ((x) = (((x) >> 24) | \
(((x) >> 8) & 0xff00) | \
(((x) << 8) & 0xff0000) | \
((x) << 24)))
#define S3ByteSwap16(x) ((x) = ((x) << 8) | ((x) >> 8))
#if BITMAP_BIT_ORDER == LSBFirst
#define S3AdjustBits32(x) S3InvertBits32(x)
#define S3AdjustBits16(x) S3InvertBits16(x)
#else
#define S3AdjustBits32(x) S3ByteSwap32(x)
#define S3AdjustBits16(x) S3ByteSwap16(x)
#endif
#define _s3WaitSlot(s3) _s3WaitSlots(s3,1)
#define _s3SetFg(s3,_fg) { \ #define _s3SetFg(s3,_fg) { \
DRAW_DEBUG ((DEBUG_REGISTERS, " fg <- 0x%x", _fg));\ DRAW_DEBUG ((DEBUG_REGISTERS, " fg <- 0x%x", _fg));\
s3->fg = (_fg); \ s3->fg = (_fg); \
@ -87,7 +147,7 @@ void _s3LoadPattern (ScreenPtr pScreen, s3PatternPtr pPattern);
#define _s3SetPixelControl(s3,_ctl) { \ #define _s3SetPixelControl(s3,_ctl) { \
DRAW_DEBUG((DEBUG_REGISTERS, " pix_cntl <- 0x%x", PIX_CNTL | (_ctl))); \ DRAW_DEBUG((DEBUG_REGISTERS, " pix_cntl <- 0x%x", PIX_CNTL | (_ctl))); \
s3->pix_cntl = PIX_CNTL | (_ctl); \ s3->pix_cntl_mult_misc2 = MERGE (CONTROL_MISC2, PIX_CNTL | (_ctl)); \
} }
#define _s3SetFgMix(s3,_mix) { \ #define _s3SetFgMix(s3,_mix) { \
@ -141,11 +201,12 @@ void _s3LoadPattern (ScreenPtr pScreen, s3PatternPtr pPattern);
DRAW_DEBUG((DEBUG_REGISTERS, " cmd <- 0x%x", _cmd)); \ DRAW_DEBUG((DEBUG_REGISTERS, " cmd <- 0x%x", _cmd)); \
_s3CmdWait(s3); \ _s3CmdWait(s3); \
s3->cmd_gp_stat = (_cmd); \ s3->cmd_gp_stat = (_cmd); \
{ CARD32 __junk__; __junk__ = s3->cmd_gp_stat; } \ /* { CARD32 __junk__; __junk__ = s3->cmd_gp_stat; } */ \
} }
#define _s3SetSolidFill(s3,pix,alu,mask) { \ #define _s3SetSolidFill(s3,pix,alu,mask) { \
DRAW_DEBUG((DEBUG_SET,"set fill 0x%x %d 0x%x",pix,alu,mask)); \ DRAW_DEBUG((DEBUG_SET,"set fill 0x%x %d 0x%x",pix,alu,mask)); \
_s3WaitSlots(s3,4); \
_s3SetFg (s3, pix); \ _s3SetFg (s3, pix); \
_s3SetWriteMask(s3,mask); \ _s3SetWriteMask(s3,mask); \
_s3SetMix (s3, FSS_FRGDCOL | s3alu[alu], BSS_BKGDCOL | MIX_SRC); \ _s3SetMix (s3, FSS_FRGDCOL | s3alu[alu], BSS_BKGDCOL | MIX_SRC); \
@ -155,7 +216,7 @@ void _s3LoadPattern (ScreenPtr pScreen, s3PatternPtr pPattern);
#define _s3SolidRect(s3,x,y,w,h) {\ #define _s3SolidRect(s3,x,y,w,h) {\
DRAW_DEBUG((DEBUG_RENDER,"solid rect %d,%d %dx%d",x,y,w,h)); \ DRAW_DEBUG((DEBUG_RENDER,"solid rect %d,%d %dx%d",x,y,w,h)); \
_s3CmdWait(s3); \ _s3WaitSlots(s3,3); \
_s3SetCur(s3, x, y); \ _s3SetCur(s3, x, y); \
_s3SetPcnt (s3, (w)-1, (h)-1); \ _s3SetPcnt (s3, (w)-1, (h)-1); \
_s3SetCmd (s3, CMD_RECT|INC_X|INC_Y|DRAW|WRTDATA); \ _s3SetCmd (s3, CMD_RECT|INC_X|INC_Y|DRAW|WRTDATA); \
@ -164,15 +225,25 @@ void _s3LoadPattern (ScreenPtr pScreen, s3PatternPtr pPattern);
#define _s3SolidLine(s3,maj,min,len,cmd) { \ #define _s3SolidLine(s3,maj,min,len,cmd) { \
DRAW_DEBUG ((DEBUG_RENDER, "solid line 0x%x 0x%x 0x%x", maj, min, cmd)); \ DRAW_DEBUG ((DEBUG_RENDER, "solid line 0x%x 0x%x 0x%x", maj, min, cmd)); \
_s3CmdWait(s3); \ _s3WaitSlots(s3,4); \
_s3SetPcnt(s3, (len), 0); \ _s3SetPcnt(s3, (len), 0); \
_s3SetStep(s3, 2*((min) - (maj)), 2*(min)); \ _s3SetStep(s3, 2*((min) - (maj)), 2*(min)); \
_s3SetErr(s3, 2*(min) - (maj)); \ _s3SetErr(s3, 2*(min) - (maj)); \
_s3SetCmd (s3, CMD_LINE | (cmd) | DRAW | WRTDATA); \ _s3SetCmd (s3, CMD_LINE | (cmd) | DRAW | WRTDATA); \
} }
#define _s3ClipLine(s3,cmd,e1,e2,e,len) {\
DRAW_DEBUG ((DEBUG_RENDER, "clip line 0x%x 0x%x 0x%x 0x%x 0x%x", cmd,e1,e2,e,len)); \
_s3WaitSlots(s3, 4); \
_s3SetPcnt (s3, (len), 0); \
_s3SetStep (s3, e2, e1); \
_s3SetErr (s3, e); \
_s3SetCmd (s3, CMD_LINE | (cmd) | DRAW | WRTDATA); \
}
#define _s3SetTile(s3,alu,mask) { \ #define _s3SetTile(s3,alu,mask) { \
DRAW_DEBUG ((DEBUG_SET,"set tile %d 0x%x", alu, mask)); \ DRAW_DEBUG ((DEBUG_SET,"set tile %d 0x%x", alu, mask)); \
_s3WaitSlots(s3,3); \
_s3SetWriteMask(s3, mask); \ _s3SetWriteMask(s3, mask); \
_s3SetMix(s3, FSS_BITBLT | s3alu[alu], BSS_BITBLT|s3alu[alu]); \ _s3SetMix(s3, FSS_BITBLT | s3alu[alu], BSS_BITBLT|s3alu[alu]); \
_s3SetPixelControl (s3, MIXSEL_FRGDMIX); \ _s3SetPixelControl (s3, MIXSEL_FRGDMIX); \
@ -185,6 +256,7 @@ void _s3LoadPattern (ScreenPtr pScreen, s3PatternPtr pPattern);
*/ */
#define _s3SetStipple(s3,alu,mask,_fg) {\ #define _s3SetStipple(s3,alu,mask,_fg) {\
DRAW_DEBUG ((DEBUG_SET,"set stipple 0x%x %d 0x%x", _fg, alu, mask)); \ DRAW_DEBUG ((DEBUG_SET,"set stipple 0x%x %d 0x%x", _fg, alu, mask)); \
_s3WaitSlots(s3,5); \
_s3SetFg (s3, _fg); \ _s3SetFg (s3, _fg); \
_s3SetBg (s3, 0); \ _s3SetBg (s3, 0); \
_s3SetWriteMask(s3,mask); \ _s3SetWriteMask(s3,mask); \
@ -195,6 +267,7 @@ void _s3LoadPattern (ScreenPtr pScreen, s3PatternPtr pPattern);
#define _s3SetOpaqueStipple(s3,alu,mask,_fg,_bg) {\ #define _s3SetOpaqueStipple(s3,alu,mask,_fg,_bg) {\
DRAW_DEBUG ((DEBUG_SET,"set opaque stipple 0x%x 0x%x %d 0x%x", _fg, _bg, alu, mask)); \ DRAW_DEBUG ((DEBUG_SET,"set opaque stipple 0x%x 0x%x %d 0x%x", _fg, _bg, alu, mask)); \
_s3WaitSlots(s3,5); \
_s3SetFg (s3, _fg); \ _s3SetFg (s3, _fg); \
_s3SetBg (s3, _bg); \ _s3SetBg (s3, _bg); \
_s3SetWriteMask(s3,mask); \ _s3SetWriteMask(s3,mask); \
@ -205,7 +278,7 @@ void _s3LoadPattern (ScreenPtr pScreen, s3PatternPtr pPattern);
#define _s3PatRect(s3,px,py,x,y,w,h) {\ #define _s3PatRect(s3,px,py,x,y,w,h) {\
DRAW_DEBUG ((DEBUG_RENDER, "pat rect %d,%d %dx%d", x,y,w,h)); \ DRAW_DEBUG ((DEBUG_RENDER, "pat rect %d,%d %dx%d", x,y,w,h)); \
_s3CmdWait(s3); \ _s3WaitSlots(s3, 4); \
_s3SetCur (s3, px, py); \ _s3SetCur (s3, px, py); \
_s3SetStep (s3, x, y); \ _s3SetStep (s3, x, y); \
_s3SetPcnt (s3, (w)-1, (h)-1); \ _s3SetPcnt (s3, (w)-1, (h)-1); \
@ -215,6 +288,7 @@ void _s3LoadPattern (ScreenPtr pScreen, s3PatternPtr pPattern);
#define _s3SetBlt(s3,alu,mask) { \ #define _s3SetBlt(s3,alu,mask) { \
DRAW_DEBUG ((DEBUG_SET,"set blt %d 0x%x", alu, mask)); \ DRAW_DEBUG ((DEBUG_SET,"set blt %d 0x%x", alu, mask)); \
_s3WaitSlots(s3,3); \
_s3SetPixelControl (s3, MIXSEL_FRGDMIX); \ _s3SetPixelControl (s3, MIXSEL_FRGDMIX); \
_s3SetMix(s3, FSS_BITBLT | s3alu[alu], BSS_BITBLT | s3alu[alu]); \ _s3SetMix(s3, FSS_BITBLT | s3alu[alu], BSS_BITBLT | s3alu[alu]); \
_s3SetWriteMask(s3, mask); \ _s3SetWriteMask(s3, mask); \
@ -224,7 +298,7 @@ void _s3LoadPattern (ScreenPtr pScreen, s3PatternPtr pPattern);
#define _s3Blt(s3,_sx,_sy,_dx,_dy,_w,_h,_dir) { \ #define _s3Blt(s3,_sx,_sy,_dx,_dy,_w,_h,_dir) { \
DRAW_DEBUG ((DEBUG_RENDER, "blt %d,%d -> %d,%d %dx%d 0x%x", \ DRAW_DEBUG ((DEBUG_RENDER, "blt %d,%d -> %d,%d %dx%d 0x%x", \
_sx,_sy,_dx,_dy,_w,_h,_dir)); \ _sx,_sy,_dx,_dy,_w,_h,_dir)); \
_s3CmdWait(s3); \ _s3WaitSlots(s3,4); \
_s3SetCur(s3,_sx,_sy); \ _s3SetCur(s3,_sx,_sy); \
_s3SetStep(s3,_dx,_dy); \ _s3SetStep(s3,_dx,_dy); \
_s3SetPcnt(s3,(_w)-1,(_h)-1); \ _s3SetPcnt(s3,(_w)-1,(_h)-1); \
@ -235,6 +309,8 @@ void _s3LoadPattern (ScreenPtr pScreen, s3PatternPtr pPattern);
#define _s3SetOpaquePlaneBlt(s3,alu,mask,_fg,_bg) {\ #define _s3SetOpaquePlaneBlt(s3,alu,mask,_fg,_bg) {\
DRAW_DEBUG ((DEBUG_SET,"set opaque plane blt 0x%x 0x%x %d 0x%x", \ DRAW_DEBUG ((DEBUG_SET,"set opaque plane blt 0x%x 0x%x %d 0x%x", \
_fg, _bg, alu, mask)); \ _fg, _bg, alu, mask)); \
/* _s3WaitSlots(s3, 5); */ \
_s3WaitIdleEmpty (s3); \
_s3SetFg(s3,_fg); \ _s3SetFg(s3,_fg); \
_s3SetBg(s3,_bg); \ _s3SetBg(s3,_bg); \
_s3SetWriteMask(s3,mask); \ _s3SetWriteMask(s3,mask); \
@ -246,6 +322,8 @@ void _s3LoadPattern (ScreenPtr pScreen, s3PatternPtr pPattern);
#define _s3SetTransparentPlaneBlt(s3,alu,mask,_fg) {\ #define _s3SetTransparentPlaneBlt(s3,alu,mask,_fg) {\
DRAW_DEBUG ((DEBUG_SET,"set transparent plane blt 0x%x %d 0x%x", \ DRAW_DEBUG ((DEBUG_SET,"set transparent plane blt 0x%x %d 0x%x", \
_fg, alu, mask)); \ _fg, alu, mask)); \
/*_s3WaitSlots(s3, 4); */ \
_s3WaitIdleEmpty (s3); \
_s3SetFg(s3,_fg); \ _s3SetFg(s3,_fg); \
_s3SetWriteMask(s3,mask); \ _s3SetWriteMask(s3,mask); \
_s3SetMix(s3,FSS_FRGDCOL|s3alu[alu], BSS_BKGDCOL|MIX_DST); \ _s3SetMix(s3,FSS_FRGDCOL|s3alu[alu], BSS_BKGDCOL|MIX_DST); \
@ -256,7 +334,8 @@ void _s3LoadPattern (ScreenPtr pScreen, s3PatternPtr pPattern);
/* Across the plane blt */ /* Across the plane blt */
#define _s3PlaneBlt(s3,x,y,w,h) {\ #define _s3PlaneBlt(s3,x,y,w,h) {\
DRAW_DEBUG ((DEBUG_RENDER, "plane blt %d,%d %dx%d", x,y,w,h)); \ DRAW_DEBUG ((DEBUG_RENDER, "plane blt %d,%d %dx%d", x,y,w,h)); \
_s3CmdWait(s3); \ _s3WaitSlots(s3, 4); \
_s3SetPixelControl(s3,MIXSEL_EXPPC); \
_s3SetCur(s3, x, y); \ _s3SetCur(s3, x, y); \
_s3SetPcnt (s3, (w)-1, (h)-1); \ _s3SetPcnt (s3, (w)-1, (h)-1); \
_s3SetCmd (s3, \ _s3SetCmd (s3, \
@ -274,7 +353,7 @@ void _s3LoadPattern (ScreenPtr pScreen, s3PatternPtr pPattern);
#define _s3SetClip(s3,pbox) {\ #define _s3SetClip(s3,pbox) {\
DRAW_DEBUG ((DEBUG_SET, "set clip %dx%d -> %dx%d ", \ DRAW_DEBUG ((DEBUG_SET, "set clip %dx%d -> %dx%d ", \
pbox->x1, pbox->y1, pbox->x2, pbox->y2)); \ pbox->x1, pbox->y1, pbox->x2, pbox->y2)); \
_s3WaitEmpty(s3); \ _s3WaitSlots(s3, 2); \
_s3SetScissorsTl(s3,(pbox)->x1, (pbox)->y1); \ _s3SetScissorsTl(s3,(pbox)->x1, (pbox)->y1); \
_s3SetScissorsBr(s3,(pbox)->x2 - 1, (pbox)->y2 - 1); \ _s3SetScissorsBr(s3,(pbox)->x2 - 1, (pbox)->y2 - 1); \
DRAW_DEBUG((DEBUG_SET," done")); \ DRAW_DEBUG((DEBUG_SET," done")); \
@ -282,7 +361,7 @@ void _s3LoadPattern (ScreenPtr pScreen, s3PatternPtr pPattern);
#define _s3ResetClip(s3,pScreen) { \ #define _s3ResetClip(s3,pScreen) { \
DRAW_DEBUG ((DEBUG_SET, "reset clip")); \ DRAW_DEBUG ((DEBUG_SET, "reset clip")); \
_s3WaitEmpty(s3); \ _s3WaitSlots(s3, 2); \
_s3SetScissorsTl(s3,0,0); \ _s3SetScissorsTl(s3,0,0); \
_s3SetScissorsBr(s3,pScreen->width - 1, pScreen->height - 1); \ _s3SetScissorsBr(s3,pScreen->width - 1, pScreen->height - 1); \
DRAW_DEBUG((DEBUG_SET," done")); \ DRAW_DEBUG((DEBUG_SET," done")); \
@ -297,6 +376,11 @@ s3CopyPlane(DrawablePtr pSrcDrawable, DrawablePtr pDstDrawable, GCPtr pGC,
int srcx, int srcy, int width, int height, int srcx, int srcy, int width, int height,
int dstx, int dsty, unsigned long bitPlane); int dstx, int dsty, unsigned long bitPlane);
void
s3PushPixels (GCPtr pGC, PixmapPtr pBitmap,
DrawablePtr pDrawable,
int w, int h, int x, int y);
void void
s3FillBoxSolid (DrawablePtr pDrawable, int nBox, BoxPtr pBox, s3FillBoxSolid (DrawablePtr pDrawable, int nBox, BoxPtr pBox,
unsigned long pixel, int alu, unsigned long planemask); unsigned long pixel, int alu, unsigned long planemask);
@ -369,4 +453,7 @@ s3CheckGCFill (GCPtr pGC);
void void
s3MoveGCFill (GCPtr pGC); s3MoveGCFill (GCPtr pGC);
void
s3SyncProc (DrawablePtr pDrawable);
#endif #endif

View File

@ -22,7 +22,7 @@
* *
* Author: Keith Packard, SuSE, Inc. * Author: Keith Packard, SuSE, Inc.
*/ */
/* $XFree86: $ */ /* $XFree86: xc/programs/Xserver/hw/kdrive/savage/s3gc.c,v 1.1 1999/11/19 13:53:56 hohndel Exp $ */
#include "s3.h" #include "s3.h"
#include "s3draw.h" #include "s3draw.h"
@ -48,17 +48,17 @@
*/ */
/* TE font, >= 4 pixels wide, one clip rectangle */ /* TE font, >= 4 pixels wide, one clip rectangle */
static GCOps s3TEOps1Rect = { static const GCOps s3TEOps1Rect = {
s3FillSpans, s3FillSpans,
fbSetSpans, KdCheckSetSpans,
fbPutImage, KdCheckPutImage,
s3CopyArea, s3CopyArea,
s3CopyPlane, s3CopyPlane,
fbPolyPoint, KdCheckPolyPoint,
s3Polylines, s3Polylines,
s3PolySegment, s3PolySegment,
miPolyRectangle, miPolyRectangle,
fbPolyArc, KdCheckPolyArc,
s3FillPoly1Rect, s3FillPoly1Rect,
s3PolyFillRect, s3PolyFillRect,
s3PolyFillArcSolid, s3PolyFillArcSolid,
@ -68,7 +68,7 @@ static GCOps s3TEOps1Rect = {
miImageText16, miImageText16,
s3ImageTEGlyphBlt, s3ImageTEGlyphBlt,
s3PolyTEGlyphBlt, s3PolyTEGlyphBlt,
fbPushPixels, s3PushPixels,
#ifdef NEED_LINEHELPER #ifdef NEED_LINEHELPER
,NULL ,NULL
#endif #endif
@ -77,17 +77,17 @@ static GCOps s3TEOps1Rect = {
extern GCOps fbGCOps; extern GCOps fbGCOps;
/* Non TE font, one clip rectangle */ /* Non TE font, one clip rectangle */
static GCOps s3NonTEOps1Rect = { static const GCOps s3NonTEOps1Rect = {
s3FillSpans, s3FillSpans,
fbSetSpans, KdCheckSetSpans,
fbPutImage, KdCheckPutImage,
s3CopyArea, s3CopyArea,
s3CopyPlane, s3CopyPlane,
fbPolyPoint, KdCheckPolyPoint,
s3Polylines, s3Polylines,
s3PolySegment, s3PolySegment,
miPolyRectangle, miPolyRectangle,
fbPolyArc, KdCheckPolyArc,
s3FillPoly1Rect, s3FillPoly1Rect,
s3PolyFillRect, s3PolyFillRect,
s3PolyFillArcSolid, s3PolyFillArcSolid,
@ -97,24 +97,24 @@ static GCOps s3NonTEOps1Rect = {
miImageText16, miImageText16,
s3ImageGlyphBlt, s3ImageGlyphBlt,
s3PolyGlyphBlt, s3PolyGlyphBlt,
fbPushPixels s3PushPixels
#ifdef NEED_LINEHELPER #ifdef NEED_LINEHELPER
,NULL ,NULL
#endif #endif
}; };
/* TE font, != 1 clip rect (including 0) */ /* TE font, != 1 clip rect (including 0) */
static GCOps s3TEOps = { static const GCOps s3TEOps = {
s3FillSpans, s3FillSpans,
fbSetSpans, KdCheckSetSpans,
fbPutImage, KdCheckPutImage,
s3CopyArea, s3CopyArea,
s3CopyPlane, s3CopyPlane,
fbPolyPoint, KdCheckPolyPoint,
s3Polylines, s3Polylines,
s3PolySegment, s3PolySegment,
miPolyRectangle, miPolyRectangle,
fbPolyArc, KdCheckPolyArc,
miFillPolygon, miFillPolygon,
s3PolyFillRect, s3PolyFillRect,
s3PolyFillArcSolid, s3PolyFillArcSolid,
@ -124,24 +124,24 @@ static GCOps s3TEOps = {
miImageText16, miImageText16,
s3ImageTEGlyphBlt, s3ImageTEGlyphBlt,
s3PolyTEGlyphBlt, s3PolyTEGlyphBlt,
fbPushPixels s3PushPixels
#ifdef NEED_LINEHELPER #ifdef NEED_LINEHELPER
,NULL ,NULL
#endif #endif
}; };
/* Non TE font, != 1 clip rect (including 0) */ /* Non TE font, != 1 clip rect (including 0) */
static GCOps s3NonTEOps = { static const GCOps s3NonTEOps = {
s3FillSpans, s3FillSpans,
fbSetSpans, KdCheckSetSpans,
fbPutImage, KdCheckPutImage,
s3CopyArea, s3CopyArea,
s3CopyPlane, s3CopyPlane,
fbPolyPoint, KdCheckPolyPoint,
s3Polylines, s3Polylines,
s3PolySegment, s3PolySegment,
miPolyRectangle, miPolyRectangle,
fbPolyArc, KdCheckPolyArc,
miFillPolygon, miFillPolygon,
s3PolyFillRect, s3PolyFillRect,
s3PolyFillArcSolid, s3PolyFillArcSolid,
@ -151,7 +151,7 @@ static GCOps s3NonTEOps = {
miImageText16, miImageText16,
s3ImageGlyphBlt, s3ImageGlyphBlt,
s3PolyGlyphBlt, s3PolyGlyphBlt,
fbPushPixels s3PushPixels
#ifdef NEED_LINEHELPER #ifdef NEED_LINEHELPER
,NULL ,NULL
#endif #endif
@ -169,7 +169,7 @@ s3MatchCommon (DrawablePtr pDraw, GCPtr pGC, FbGCPrivPtr fbPriv)
} }
if (pDraw->type != DRAWABLE_WINDOW) if (pDraw->type != DRAWABLE_WINDOW)
return (GCOps *) &fbGCOps; return (GCOps *) &kdAsyncPixmapGCOps;
if (pGC->lineWidth != 0) if (pGC->lineWidth != 0)
return 0; return 0;
@ -184,16 +184,16 @@ s3MatchCommon (DrawablePtr pDraw, GCPtr pGC, FbGCPrivPtr fbPriv)
if (TERMINALFONT(pGC->font)) if (TERMINALFONT(pGC->font))
{ {
if (fbPriv->oneRect) if (fbPriv->oneRect)
return &s3TEOps1Rect; return (GCOps *) &s3TEOps1Rect;
else else
return &s3TEOps; return (GCOps *) &s3TEOps;
} }
else else
{ {
if (fbPriv->oneRect) if (fbPriv->oneRect)
return &s3NonTEOps1Rect; return (GCOps *) &s3NonTEOps1Rect;
else else
return &s3NonTEOps; return (GCOps *) &s3NonTEOps;
} }
} }
return 0; return 0;
@ -283,7 +283,7 @@ s3ValidateGC (GCPtr pGC, Mask changes, DrawablePtr pDrawable)
*/ */
if (pGC->ops == &kdNoopOps) if (pGC->ops == &kdNoopOps)
{ {
pGC->ops = (GCOps *) &fbGCOps; pGC->ops = (GCOps *) &kdAsyncPixmapGCOps;
new_type = TRUE; new_type = TRUE;
} }
pGC->ops = miCreateGCOps (pGC->ops); pGC->ops = miCreateGCOps (pGC->ops);
@ -295,8 +295,8 @@ s3ValidateGC (GCPtr pGC, Mask changes, DrawablePtr pDrawable)
*/ */
if (new_type || (changes & (GCFillStyle|GCTile|GCStipple))) if (new_type || (changes & (GCFillStyle|GCTile|GCStipple)))
{ {
pGC->ops->FillSpans = fbFillSpans; pGC->ops->FillSpans = KdCheckFillSpans;
pGC->ops->PolyFillRect = fbPolyFillRect; pGC->ops->PolyFillRect = KdCheckPolyFillRect;
if (s3Priv->type == DRAWABLE_WINDOW && if (s3Priv->type == DRAWABLE_WINDOW &&
(pGC->fillStyle != FillTiled || s3Priv->pPattern)) (pGC->fillStyle != FillTiled || s3Priv->pPattern))
{ {
@ -310,13 +310,9 @@ s3ValidateGC (GCPtr pGC, Mask changes, DrawablePtr pDrawable)
*/ */
if (new_type) if (new_type)
{ {
pGC->ops->CopyArea = fbCopyArea; pGC->ops->CopyArea = s3CopyArea;
pGC->ops->CopyPlane = fbCopyPlane; pGC->ops->CopyPlane = s3CopyPlane;
if (s3Priv->type == DRAWABLE_WINDOW) pGC->ops->PushPixels = s3PushPixels;
{
pGC->ops->CopyArea = s3CopyArea;
pGC->ops->CopyPlane = s3CopyPlane;
}
} }
/* /*
@ -324,8 +320,8 @@ s3ValidateGC (GCPtr pGC, Mask changes, DrawablePtr pDrawable)
*/ */
if (new_type || (changes & (GCLineStyle|GCLineWidth|GCFillStyle))) if (new_type || (changes & (GCLineStyle|GCLineWidth|GCFillStyle)))
{ {
pGC->ops->Polylines = fbPolyLine; pGC->ops->Polylines = KdCheckPolylines;
pGC->ops->PolySegment = fbPolySegment; pGC->ops->PolySegment = miPolySegment;
if (pGC->lineStyle == LineSolid && if (pGC->lineStyle == LineSolid &&
pGC->lineWidth == 0 && pGC->lineWidth == 0 &&
pGC->fillStyle == FillSolid && pGC->fillStyle == FillSolid &&
@ -355,7 +351,7 @@ s3ValidateGC (GCPtr pGC, Mask changes, DrawablePtr pDrawable)
*/ */
if (new_type || (changes & GCFillStyle)) if (new_type || (changes & GCFillStyle))
{ {
pGC->ops->PolyFillArc = fbPolyFillArc; pGC->ops->PolyFillArc = miPolyFillArc;
if (s3Priv->type == DRAWABLE_WINDOW && if (s3Priv->type == DRAWABLE_WINDOW &&
pGC->fillStyle == FillSolid) pGC->fillStyle == FillSolid)
{ {
@ -368,8 +364,8 @@ s3ValidateGC (GCPtr pGC, Mask changes, DrawablePtr pDrawable)
*/ */
if (new_type || (changes & (GCFont|GCFillStyle))) if (new_type || (changes & (GCFont|GCFillStyle)))
{ {
pGC->ops->PolyGlyphBlt = fbPolyGlyphBlt; pGC->ops->PolyGlyphBlt = KdCheckPolyGlyphBlt;
pGC->ops->ImageGlyphBlt = fbImageGlyphBlt; pGC->ops->ImageGlyphBlt = KdCheckImageGlyphBlt;
if (s3Priv->type == DRAWABLE_WINDOW && pGC->font) if (s3Priv->type == DRAWABLE_WINDOW && pGC->font)
{ {
if (pGC->fillStyle == FillSolid) if (pGC->fillStyle == FillSolid)

View File

@ -22,7 +22,7 @@
* *
* Author: Keith Packard, SuSE, Inc. * Author: Keith Packard, SuSE, Inc.
*/ */
/* $XFree86: $ */ /* $XFree86: xc/programs/Xserver/hw/kdrive/savage/s3reg.c,v 1.1 1999/11/19 13:53:57 hohndel Exp $ */
#include "s3reg.h" #include "s3reg.h"
@ -360,6 +360,16 @@ VgaReg s3_v_blank_end[] = {
VGA_REG_END VGA_REG_END
}; };
VgaReg s3_2bk_cga[] = {
CR17, 0, 1,
VGA_REG_END
};
VgaReg s3_4bk_hga[] = {
CR17, 1, 1,
VGA_REG_END
};
VgaReg s3_v_total_double[] = { VgaReg s3_v_total_double[] = {
CR17, 2, 1, CR17, 2, 1,
VGA_REG_END VGA_REG_END
@ -370,11 +380,21 @@ VgaReg s3_word_mode[] = {
VGA_REG_END VGA_REG_END
}; };
VgaReg s3_address_16k_wrap[] = {
CR17, 5, 1,
VGA_REG_END
};
VgaReg s3_byte_mode[] = { VgaReg s3_byte_mode[] = {
CR17, 6, 1, CR17, 6, 1,
VGA_REG_END VGA_REG_END
}; };
VgaReg s3_hardware_reset[] = {
CR17, 7, 1,
VGA_REG_END
};
VgaReg s3_line_compare[] = { VgaReg s3_line_compare[] = {
CR18, 0, 8, CR18, 0, 8,
CR07, 4, 1, CR07, 4, 1,
@ -414,6 +434,11 @@ VgaReg s3_border_select[] = {
VGA_REG_END VGA_REG_END
}; };
VgaReg s3_lock_palette[] = {
CR33, 6, 1,
VGA_REG_END
};
VgaReg s3_enable_sff[] = { VgaReg s3_enable_sff[] = {
CR34, 4, 1, CR34, 4, 1,
VGA_REG_END VGA_REG_END
@ -639,6 +664,11 @@ VgaReg s3_color_mode[] = {
VGA_REG_END VGA_REG_END
}; };
VgaReg s3_primary_stream_timeout[] = {
CR71, 0, 8,
VGA_REG_END
};
VgaReg s3_master_control_unit_timeout[] = { VgaReg s3_master_control_unit_timeout[] = {
CR74, 0, 8, CR74, 0, 8,
VGA_REG_END VGA_REG_END
@ -674,6 +704,16 @@ VgaReg s3_fifo_fetch_timing[] = {
VGA_REG_END VGA_REG_END
}; };
VgaReg s3_dac_power_up_time[] = {
CR86, 0, 7,
VGA_REG_END
};
VgaReg s3_dac_power_saving_disable[] = {
CR86, 7, 1,
VGA_REG_END
};
VgaReg s3_primary_stream_l1[] = { VgaReg s3_primary_stream_l1[] = {
CR91, 0, 8, CR91, 0, 8,
CR90, 0, 3, CR90, 0, 3,
@ -985,7 +1025,22 @@ VgaReg s3_enable_blinking[] = {
VGA_REG_END VGA_REG_END
}; };
#define AR_LAST AR10 VgaReg s3_border_color[] = {
AR11, 0, 8,
VGA_REG_END
};
#define AR_LAST AR11
VgaReg s3_io_addr_select[] = {
S3_MISC_OUT, 0, 1,
VGA_REG_END
};
VgaReg s3_enable_ram[] = {
S3_MISC_OUT, 1, 1,
VGA_REG_END
};
VgaReg s3_clock_select[] = { VgaReg s3_clock_select[] = {
S3_MISC_OUT, 2, 2, S3_MISC_OUT, 2, 2,
@ -1002,13 +1057,43 @@ VgaReg s3_vert_sync_neg[] = {
VGA_REG_END VGA_REG_END
}; };
VgaReg s3_display_mode_inactive[] = {
S3_INPUT_STATUS_1, 0, 1,
VGA_REG_END
};
VgaReg s3_vertical_sync_active[] = {
S3_INPUT_STATUS_1, 3, 1,
VGA_REG_END
};
VgaReg s3_dac_mask[] = {
S3_DAC + 0, 0, 8,
VGA_REG_END
};
VgaReg s3_dac_read_index[] = {
S3_DAC + 1, 0, 8,
VGA_REG_END
};
VgaReg s3_dac_write_index[] = {
S3_DAC + 2, 0, 8,
VGA_REG_END
};
VgaReg s3_dac_data[] = {
S3_DAC + 3, 0, 8,
VGA_REG_END
};
VGA8 VGA8
_s3Inb (VgaCard *card, VGA16 port) _s3Inb (VgaCard *card, VGA16 port)
{ {
VGAVOL8 *reg; VGAVOL8 *reg;
if (card->closure) if (card->closure)
return *(((VGAVOL8 *) card->closure) + port); return VgaReadMemb ((VGA32) card->closure + port);
else else
return VgaInb (port); return VgaInb (port);
} }
@ -1016,10 +1101,8 @@ _s3Inb (VgaCard *card, VGA16 port)
void void
_s3Outb (VgaCard *card, VGA8 value, VGA16 port) _s3Outb (VgaCard *card, VGA8 value, VGA16 port)
{ {
VGAVOL8 *reg;
if (card->closure) if (card->closure)
*(((VGAVOL8 *) card->closure) + port) = value; VgaWriteMemb (value, (VGA32) card->closure + port);
else else
VgaOutb (value, port); VgaOutb (value, port);
} }
@ -1050,14 +1133,19 @@ _s3RegMap (VgaCard *card, VGA16 reg, VgaMap *map, VGABOOL write)
map->access = VgaAccessDone; map->access = VgaAccessDone;
/* reset AFF to index */ /* reset AFF to index */
(void) _s3Inb (card, 0x3da); (void) _s3Inb (card, 0x3da);
if (reg >= 16)
reg |= 0x20;
_s3Outb (card, reg, 0x3c0); _s3Outb (card, reg, 0x3c0);
if (write) if (write)
_s3Outb (card, map->value, 0x3c0); _s3Outb (card, map->value, 0x3c0);
else else
map->value = _s3Inb (card, 0x3c1); map->value = _s3Inb (card, 0x3c1);
/* enable video display again */ if (!(reg & 0x20))
(void) _s3Inb (card, 0x3da); {
_s3Outb (card, 0x20, 0x3c0); /* enable video display again */
(void) _s3Inb (card, 0x3da);
_s3Outb (card, 0x20, 0x3c0);
}
return; return;
} }
else if (reg < S3_CR + S3_NCR) else if (reg < S3_CR + S3_NCR)
@ -1068,6 +1156,11 @@ _s3RegMap (VgaCard *card, VGA16 reg, VgaMap *map, VGABOOL write)
map->value = 1; map->value = 1;
map->index = reg - S3_CR; map->index = reg - S3_CR;
} }
else if (reg < S3_DAC + S3_NDAC)
{
map->access = VgaAccessIo;
map->port = 0x3c6 + reg - S3_DAC;
}
else switch (reg) { else switch (reg) {
case S3_MISC_OUT: case S3_MISC_OUT:
map->access = VgaAccessIo; map->access = VgaAccessIo;
@ -1076,6 +1169,10 @@ _s3RegMap (VgaCard *card, VGA16 reg, VgaMap *map, VGABOOL write)
else else
map->port = 0x3cc; map->port = 0x3cc;
break; break;
case S3_INPUT_STATUS_1:
map->access = VgaAccessIo;
map->port = 0x3da;
break;
} }
if (card->closure) if (card->closure)
{ {
@ -1115,7 +1212,7 @@ s3Save (S3Vga *s3vga)
s3vga->save_register_lock_1 = s3Get (s3vga, s3_register_lock_1); s3vga->save_register_lock_1 = s3Get (s3vga, s3_register_lock_1);
s3SetImm (s3vga, s3_register_lock_1, 0x48); s3SetImm (s3vga, s3_register_lock_1, 0x48);
s3vga->save_register_lock_2 = s3Get (s3vga, s3_register_lock_2); s3vga->save_register_lock_2 = s3Get (s3vga, s3_register_lock_2);
s3SetImm (s3vga, s3_register_lock_2, 0xa0); s3SetImm (s3vga, s3_register_lock_2, 0xa5);
s3vga->save_unlock_extended_sequencer = s3Get (s3vga, s3_unlock_extended_sequencer); s3vga->save_unlock_extended_sequencer = s3Get (s3vga, s3_unlock_extended_sequencer);
s3SetImm (s3vga, s3_unlock_extended_sequencer, 0x06); s3SetImm (s3vga, s3_unlock_extended_sequencer, 0x06);
s3vga->save_lock_horz = s3Get (s3vga, s3_lock_horz); s3vga->save_lock_horz = s3Get (s3vga, s3_lock_horz);

View File

@ -22,7 +22,7 @@
* *
* Author: Keith Packard, SuSE, Inc. * Author: Keith Packard, SuSE, Inc.
*/ */
/* $XFree86: $ */ /* $XFree86: xc/programs/Xserver/hw/kdrive/savage/s3reg.h,v 1.1 1999/11/19 13:53:57 hohndel Exp $ */
#ifndef _S3REG_H_ #ifndef _S3REG_H_
#define _S3REG_H_ #define _S3REG_H_
@ -37,8 +37,11 @@
#define S3_NAR 0x15 #define S3_NAR 0x15
#define S3_CR (S3_AR+S3_NAR) #define S3_CR (S3_AR+S3_NAR)
#define S3_NCR 0xc0 #define S3_NCR 0xc0
#define S3_MISC_OUT (S3_CR+S3_NCR) #define S3_DAC (S3_CR+S3_NCR)
#define S3_NREG (S3_MISC_OUT+1) #define S3_NDAC 4
#define S3_MISC_OUT (S3_DAC + S3_NDAC)
#define S3_INPUT_STATUS_1 (S3_MISC_OUT+1)
#define S3_NREG (S3_INPUT_STATUS_1+1)
extern VgaReg s3_h_total[]; extern VgaReg s3_h_total[];
extern VgaReg s3_h_display_end[]; extern VgaReg s3_h_display_end[];
@ -63,9 +66,13 @@ extern VgaReg s3_count_by_4_mode[];
extern VgaReg s3_doubleword_mode[]; extern VgaReg s3_doubleword_mode[];
extern VgaReg s3_v_blank_start[]; extern VgaReg s3_v_blank_start[];
extern VgaReg s3_v_blank_end[]; extern VgaReg s3_v_blank_end[];
extern VgaReg s3_2bk_cga[];
extern VgaReg s3_4bk_hga[];
extern VgaReg s3_v_total_double[]; extern VgaReg s3_v_total_double[];
extern VgaReg s3_address_16k_wrap[];
extern VgaReg s3_word_mode[]; extern VgaReg s3_word_mode[];
extern VgaReg s3_byte_mode[]; extern VgaReg s3_byte_mode[];
extern VgaReg s3_hardware_reset[];
extern VgaReg s3_line_compare[]; extern VgaReg s3_line_compare[];
extern VgaReg s3_device_id[]; extern VgaReg s3_device_id[];
extern VgaReg s3_revision[]; extern VgaReg s3_revision[];
@ -74,6 +81,7 @@ extern VgaReg s3_enhanced_memory_mapping[];
extern VgaReg s3_enable_sff[]; extern VgaReg s3_enable_sff[];
extern VgaReg s3_lock_dac_writes[]; extern VgaReg s3_lock_dac_writes[];
extern VgaReg s3_border_select[]; extern VgaReg s3_border_select[];
extern VgaReg s3_lock_palette[];
extern VgaReg s3_lock_vert[]; extern VgaReg s3_lock_vert[];
extern VgaReg s3_lock_horz[]; extern VgaReg s3_lock_horz[];
extern VgaReg s3_io_disable[]; extern VgaReg s3_io_disable[];
@ -117,6 +125,7 @@ extern VgaReg s3_enable_2d_3d[];
extern VgaReg s3_pci_disconnect_enable[]; extern VgaReg s3_pci_disconnect_enable[];
extern VgaReg s3_pci_retry_enable[]; extern VgaReg s3_pci_retry_enable[];
extern VgaReg s3_color_mode[]; extern VgaReg s3_color_mode[];
extern VgaReg s3_primary_stream_timeout[];
extern VgaReg s3_master_control_unit_timeout[]; extern VgaReg s3_master_control_unit_timeout[];
extern VgaReg s3_command_buffer_timeout[]; extern VgaReg s3_command_buffer_timeout[];
extern VgaReg s3_lpb_timeout[]; extern VgaReg s3_lpb_timeout[];
@ -124,6 +133,8 @@ extern VgaReg s3_cpu_timeout[];
extern VgaReg s3_2d_graphics_engine_timeout[]; extern VgaReg s3_2d_graphics_engine_timeout[];
extern VgaReg s3_fifo_drain_delay[]; extern VgaReg s3_fifo_drain_delay[];
extern VgaReg s3_fifo_fetch_timing[]; extern VgaReg s3_fifo_fetch_timing[];
extern VgaReg s3_dac_power_up_time[];
extern VgaReg s3_dac_power_saving_disable[];
extern VgaReg s3_primary_stream_l1[]; extern VgaReg s3_primary_stream_l1[];
extern VgaReg s3_dot_clock_8[]; extern VgaReg s3_dot_clock_8[];
@ -161,10 +172,22 @@ extern VgaReg s3_vga_dclk_m2[];
extern VgaReg s3_vga_clk_select[]; extern VgaReg s3_vga_clk_select[];
extern VgaReg s3_select_graphics_mode[]; extern VgaReg s3_select_graphics_mode[];
extern VgaReg s3_enable_blinking[]; extern VgaReg s3_enable_blinking[];
extern VgaReg s3_border_color[];
extern VgaReg s3_io_addr_select[];
extern VgaReg s3_enable_ram[];
extern VgaReg s3_clock_select[]; extern VgaReg s3_clock_select[];
extern VgaReg s3_horz_sync_neg[]; extern VgaReg s3_horz_sync_neg[];
extern VgaReg s3_vert_sync_neg[]; extern VgaReg s3_vert_sync_neg[];
extern VgaReg s3_display_mode_inactive[];
extern VgaReg s3_vertical_sync_active[];
extern VgaReg s3_dac_mask[];
extern VgaReg s3_dac_read_index[];
extern VgaReg s3_dac_write_index[];
extern VgaReg s3_dac_data[];
#define s3Get(sv,r) VgaGet(&(sv)->card, (r)) #define s3Get(sv,r) VgaGet(&(sv)->card, (r))
#define s3GetImm(sv,r) VgaGetImm(&(sv)->card, (r)) #define s3GetImm(sv,r) VgaGetImm(&(sv)->card, (r))
#define s3Set(sv,r,v) VgaSet(&(sv)->card, (r), (v)) #define s3Set(sv,r,v) VgaSet(&(sv)->card, (r), (v))

View File

@ -22,7 +22,7 @@
* *
* Author: Keith Packard, SuSE, Inc. * Author: Keith Packard, SuSE, Inc.
*/ */
/* $XFree86: $ */ /* $XFree86: xc/programs/Xserver/hw/kdrive/savage/s3stub.c,v 1.1 1999/11/19 13:53:57 hohndel Exp $ */
#include "s3.h" #include "s3.h"
@ -30,6 +30,13 @@ void
InitCard (char *name) InitCard (char *name)
{ {
KdCardAttr attr; KdCardAttr attr;
#ifdef VXWORKS
attr.naddr = 2;
attr.io = 0;
attr.address[0] = 0xbc000000; /* registers */
attr.address[1] = 0xba000000; /* frame buffer */
KdCardInfoAdd (&s3Funcs, &attr, 0);
#else
CARD32 count; CARD32 count;
count = 0; count = 0;
@ -38,6 +45,7 @@ InitCard (char *name)
KdCardInfoAdd (&s3Funcs, &attr, 0); KdCardInfoAdd (&s3Funcs, &attr, 0);
count++; count++;
} }
#endif
} }
void void
@ -49,12 +57,31 @@ InitOutput (ScreenInfo *pScreenInfo, int argc, char **argv)
void void
InitInput (int argc, char **argv) InitInput (int argc, char **argv)
{ {
#ifdef VXWORKS
KdInitInput (&VxWorksMouseFuncs, &VxWorksKeyboardFuncs);
#endif
#ifdef linux
KdInitInput (&Ps2MouseFuncs, &LinuxKeyboardFuncs); KdInitInput (&Ps2MouseFuncs, &LinuxKeyboardFuncs);
#endif
} }
void extern int s3CpuTimeout;
OsVendorInit (void) extern int s3AccelTimeout;
int
ddxProcessArgument (int argc, char **argv, int i)
{ {
KdOsInit (&LinuxFuncs); int ret;
if (!strcmp (argv[i], "-cpu"))
{
s3CpuTimeout = strtol(argv[i+1], NULL, 0);
return 2;
}
if (!strcmp (argv[i], "-accel"))
{
s3AccelTimeout = strtol (argv[i+1], NULL, 0);
return 2;
}
return KdProcessArgument (argc, argv, i);
} }

View File

@ -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: $ */ /* $XFree86: xc/programs/Xserver/hw/kdrive/sis530/sis.c,v 1.1 1999/11/19 13:53:58 hohndel Exp $ */
#include "sis.h" #include "sis.h"
@ -932,6 +932,7 @@ sisCardFini (KdCardInfo *card)
KdCardFuncs sisFuncs = { KdCardFuncs sisFuncs = {
sisCardInit, sisCardInit,
sisScreenInit, sisScreenInit,
0,
sisPreserve, sisPreserve,
sisEnable, sisEnable,
sisDPMS, sisDPMS,
@ -946,6 +947,7 @@ KdCardFuncs sisFuncs = {
0, 0,
sisDrawInit, sisDrawInit,
sisDrawEnable, sisDrawEnable,
sisDrawSync,
sisDrawDisable, sisDrawDisable,
sisDrawFini, sisDrawFini,
sisGetColors, sisGetColors,

View File

@ -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: $ */ /* $XFree86: xc/programs/Xserver/hw/kdrive/sis530/sis.h,v 1.1 1999/11/19 13:53:58 hohndel Exp $ */
#ifndef _SIS_H_ #ifndef _SIS_H_
#define _SIS_H_ #define _SIS_H_
@ -1098,6 +1098,7 @@ void sisRecolorCursor (ScreenPtr pScreen, int ndef, xColorItem *pdefs);
Bool sisDrawInit (ScreenPtr pScreen); Bool sisDrawInit (ScreenPtr pScreen);
void sisDrawEnable (ScreenPtr pScreen); void sisDrawEnable (ScreenPtr pScreen);
void sisDrawSync (ScreenPtr pScreen);
void sisDrawDisable (ScreenPtr pScreen); void sisDrawDisable (ScreenPtr pScreen);
void sisDrawFini (ScreenPtr pScreen); void sisDrawFini (ScreenPtr pScreen);

View File

@ -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: $ */ /* $XFree86: xc/programs/Xserver/hw/kdrive/sis530/sisdraw.c,v 1.1 1999/11/19 13:53:59 hohndel Exp $ */
#include "sis.h" #include "sis.h"
#include "sisdraw.h" #include "sisdraw.h"
@ -292,7 +292,7 @@ sisGlyphBltClipped (DrawablePtr pDrawable,
} }
_sisClip (sis, 0, 0, _sisClip (sis, 0, 0,
pScreenPriv->screen->width, pScreenPriv->screen->height); pScreenPriv->screen->width, pScreenPriv->screen->height);
_sisWaitIdleEmpty(sis); KdMarkSync (pDrawable->pScreen);
} }
Bool Bool
@ -493,7 +493,7 @@ sisTEGlyphBlt (DrawablePtr pDrawable,
} }
if (imageBlt) if (imageBlt)
sis->u.general.clip_right = pScreenPriv->screen->width; sis->u.general.clip_right = pScreenPriv->screen->width;
_sisWaitIdleEmpty(sis); KdMarkSync (pDrawable->pScreen);
return TRUE; return TRUE;
} }
@ -704,7 +704,7 @@ sisGlyphBlt(DrawablePtr pDrawable,
} }
x += pci->metrics.characterWidth; x += pci->metrics.characterWidth;
} }
_sisWaitIdleEmpty(sis); KdMarkSync (pDrawable->pScreen);
return TRUE; return TRUE;
} }
/* /*
@ -737,7 +737,7 @@ sisPolyGlyphBlt (DrawablePtr pDrawable,
return; return;
} }
} }
fbPolyGlyphBlt (pDrawable, pGC, x, y, nglyph, ppci, pglyphBase); KdCheckPolyGlyphBlt (pDrawable, pGC, x, y, nglyph, ppci, pglyphBase);
} }
void void
@ -764,7 +764,7 @@ sisImageGlyphBlt (DrawablePtr pDrawable,
return; return;
} }
} }
fbImageGlyphBlt (pDrawable, pGC, x, y, nglyph, ppci, pglyphBase); KdCheckImageGlyphBlt (pDrawable, pGC, x, y, nglyph, ppci, pglyphBase);
} }
#define sourceInvarient(alu) (((alu) & 3) == (((alu) >> 2) & 3)) #define sourceInvarient(alu) (((alu) & 3) == (((alu) >> 2) & 3))
@ -896,7 +896,7 @@ sisFillBoxSolid (DrawablePtr pDrawable, int nBox, BoxPtr pBox,
_sisRect(sis,pBox->x1,pBox->y1,pBox->x2-pBox->x1,pBox->y2-pBox->y1,cmd); _sisRect(sis,pBox->x1,pBox->y1,pBox->x2-pBox->x1,pBox->y2-pBox->y1,cmd);
pBox++; pBox++;
} }
_sisWaitIdleEmpty(sis); KdMarkSync (pDrawable->pScreen);
} }
void void
@ -913,7 +913,7 @@ sisFillBoxStipple (DrawablePtr pDrawable, GCPtr pGC,
_sisRect(sis,pBox->x1,pBox->y1,pBox->x2-pBox->x1,pBox->y2-pBox->y1,cmd); _sisRect(sis,pBox->x1,pBox->y1,pBox->x2-pBox->x1,pBox->y2-pBox->y1,cmd);
pBox++; pBox++;
} }
_sisWaitIdleEmpty (sis); KdMarkSync (pDrawable->pScreen);
} }
void void
@ -931,7 +931,7 @@ sisFillBoxTiled (DrawablePtr pDrawable,
_sisRect(sis,pBox->x1,pBox->y1,pBox->x2-pBox->x1,pBox->y2-pBox->y1,cmd); _sisRect(sis,pBox->x1,pBox->y1,pBox->x2-pBox->x1,pBox->y2-pBox->y1,cmd);
pBox++; pBox++;
} }
_sisWaitIdleEmpty (sis); KdMarkSync (pDrawable->pScreen);
} }
/* /*
@ -1003,7 +1003,7 @@ sisCopyNtoN (DrawablePtr pSrcDrawable,
_sisBlt (sis, srcX, srcY, dstX, dstY, w, h, cmd|flags); _sisBlt (sis, srcX, srcY, dstX, dstY, w, h, cmd|flags);
pbox++; pbox++;
} }
_sisWaitIdleEmpty(sis); KdMarkSync (pDstDrawable->pScreen);
} }
RegionPtr RegionPtr
@ -1022,7 +1022,7 @@ sisCopyArea(DrawablePtr pSrcDrawable, DrawablePtr pDstDrawable, GCPtr pGC,
srcx, srcy, width, height, srcx, srcy, width, height,
dstx, dsty, sisCopyNtoN, 0, 0); dstx, dsty, sisCopyNtoN, 0, 0);
} }
return fbCopyArea (pSrcDrawable, pDstDrawable, pGC, return KdCheckCopyArea (pSrcDrawable, pDstDrawable, pGC,
srcx, srcy, width, height, dstx, dsty); srcx, srcy, width, height, dstx, dsty);
} }
@ -1183,7 +1183,7 @@ sisCopy1toN (DrawablePtr pSrcDrawable,
pbox->x2 - dstx, pbox->y2 - dsty); pbox->x2 - dstx, pbox->y2 - dsty);
pbox++; pbox++;
} }
_sisWaitIdleEmpty (sis); KdMarkSync (pDstDrawable->pScreen);
} }
RegionPtr RegionPtr
@ -1207,7 +1207,7 @@ sisCopyPlane(DrawablePtr pSrcDrawable, DrawablePtr pDstDrawable, GCPtr pGC,
srcx, srcy, width, height, srcx, srcy, width, height,
dstx, dsty, sisCopy1toN, bitPlane, &args); dstx, dsty, sisCopy1toN, bitPlane, &args);
} }
return fbCopyPlane(pSrcDrawable, pDstDrawable, pGC, return KdCheckCopyPlane(pSrcDrawable, pDstDrawable, pGC,
srcx, srcy, width, height, srcx, srcy, width, height,
dstx, dsty, bitPlane); dstx, dsty, bitPlane);
} }
@ -1227,7 +1227,7 @@ sisFillSpans (DrawablePtr pDrawable, GCPtr pGC, int n,
if (!sisFillOk (pGC)) if (!sisFillOk (pGC))
{ {
fbFillSpans (pDrawable, pGC, n, ppt, pwidth, fSorted); KdCheckFillSpans (pDrawable, pGC, n, ppt, pwidth, fSorted);
return; return;
} }
nTmp = n * miFindMaxBand(fbGetCompositeClip(pGC)); nTmp = n * miFindMaxBand(fbGetCompositeClip(pGC));
@ -1269,7 +1269,7 @@ sisFillSpans (DrawablePtr pDrawable, GCPtr pGC, int n,
_sisRect(sis,x,y,width,1,cmd); _sisRect(sis,x,y,width,1,cmd);
} }
} }
_sisWaitIdleEmpty (sis); KdMarkSync (pDrawable->pScreen);
DEALLOCATE_LOCAL(pptFree); DEALLOCATE_LOCAL(pptFree);
DEALLOCATE_LOCAL(pwidthFree); DEALLOCATE_LOCAL(pwidthFree);
} }
@ -1296,7 +1296,7 @@ sisPolyFillRect (DrawablePtr pDrawable, GCPtr pGC,
if (!sisFillOk (pGC)) if (!sisFillOk (pGC))
{ {
fbPolyFillRect (pDrawable, pGC, nrectFill, prectInit); KdCheckPolyFillRect (pDrawable, pGC, nrectFill, prectInit);
return; return;
} }
prgnClip = fbGetCompositeClip(pGC); prgnClip = fbGetCompositeClip(pGC);
@ -1450,25 +1450,25 @@ sisPolyFillRect (DrawablePtr pDrawable, GCPtr pGC,
static const GCOps sisOps = { static const GCOps sisOps = {
sisFillSpans, sisFillSpans,
fbSetSpans, KdCheckSetSpans,
fbPutImage, KdCheckPutImage,
sisCopyArea, sisCopyArea,
sisCopyPlane, sisCopyPlane,
fbPolyPoint, KdCheckPolyPoint,
fbPolyLine, KdCheckPolylines,
fbPolySegment, KdCheckPolySegment,
miPolyRectangle, miPolyRectangle,
fbPolyArc, KdCheckPolyArc,
miFillPolygon, miFillPolygon,
sisPolyFillRect, sisPolyFillRect,
fbPolyFillArc, KdCheckPolyFillArc,
miPolyText8, miPolyText8,
miPolyText16, miPolyText16,
miImageText8, miImageText8,
miImageText16, miImageText16,
sisImageGlyphBlt, sisImageGlyphBlt,
sisPolyGlyphBlt, sisPolyGlyphBlt,
fbPushPixels, KdCheckPushPixels,
#ifdef NEED_LINEHELPER #ifdef NEED_LINEHELPER
,NULL ,NULL
#endif #endif
@ -1484,7 +1484,7 @@ sisValidateGC (GCPtr pGC, Mask changes, DrawablePtr pDrawable)
if (pDrawable->type == DRAWABLE_WINDOW) if (pDrawable->type == DRAWABLE_WINDOW)
pGC->ops = (GCOps *) &sisOps; pGC->ops = (GCOps *) &sisOps;
else else
pGC->ops = (GCOps *) &fbGCOps; pGC->ops = (GCOps *) &kdAsyncPixmapGCOps;
} }
GCFuncs sisGCFuncs = { GCFuncs sisGCFuncs = {
@ -1506,6 +1506,8 @@ sisCreateGC (GCPtr pGC)
if (pGC->depth != 1) if (pGC->depth != 1)
pGC->funcs = &sisGCFuncs; pGC->funcs = &sisGCFuncs;
pGC->ops = (GCOps *) &kdAsyncPixmapGCOps;
return TRUE; return TRUE;
} }
@ -1601,7 +1603,7 @@ sisPaintWindow(WindowPtr pWin, RegionPtr pRegion, int what)
} }
break; break;
} }
fbPaintWindow (pWin, pRegion, what); KdCheckPaintWindow (pWin, pRegion, what);
} }
Bool Bool
@ -1610,6 +1612,10 @@ sisDrawInit (ScreenPtr pScreen)
KdScreenPriv(pScreen); KdScreenPriv(pScreen);
sisScreenInfo(pScreenPriv); sisScreenInfo(pScreenPriv);
/*
* Hook up asynchronous drawing
*/
KdScreenInitAsync (pScreen);
/* /*
* Replace various fb screen functions * Replace various fb screen functions
*/ */
@ -1632,7 +1638,6 @@ sisDrawEnable (ScreenPtr pScreen)
base = pScreenPriv->screen->frameBuffer - sisc->frameBuffer; base = pScreenPriv->screen->frameBuffer - sisc->frameBuffer;
stride = pScreenPriv->screen->byteStride; stride = pScreenPriv->screen->byteStride;
_sisWaitIdleEmpty(sis);
sis->u.general.dst_base = base; sis->u.general.dst_base = base;
sis->u.general.dst_pitch = stride; sis->u.general.dst_pitch = stride;
sis->u.general.dst_height = pScreenPriv->screen->height; sis->u.general.dst_height = pScreenPriv->screen->height;
@ -1642,6 +1647,14 @@ sisDrawEnable (ScreenPtr pScreen)
_sisRect (sis, 0, 0, _sisRect (sis, 0, 0,
pScreenPriv->screen->width, pScreenPriv->screen->height, pScreenPriv->screen->width, pScreenPriv->screen->height,
cmd); cmd);
KdMarkSync (pScreen);
}
void
sisDrawSync (ScreenPtr pScreen)
{
SetupSis(pScreen);
_sisWaitIdleEmpty (sis); _sisWaitIdleEmpty (sis);
} }

View File

@ -22,7 +22,7 @@
* *
* Author: Keith Packard, SuSE, Inc. * Author: Keith Packard, SuSE, Inc.
*/ */
/* $XFree86: $ */ /* $XFree86: xc/programs/Xserver/hw/kdrive/sis530/sisstub.c,v 1.1 1999/11/19 13:54:00 hohndel Exp $ */
#include "sis.h" #include "sis.h"
@ -46,8 +46,8 @@ InitInput (int argc, char **argv)
KdInitInput (&Ps2MouseFuncs, &LinuxKeyboardFuncs); KdInitInput (&Ps2MouseFuncs, &LinuxKeyboardFuncs);
} }
void int
OsVendorInit (void) ddxProcessArgument (int argc, char **argv, int i)
{ {
KdOsInit (&LinuxFuncs); return KdProcessArgument (argc, argv, i);
} }

294
hw/kdrive/src/kasync.c Normal file
View File

@ -0,0 +1,294 @@
/*
* $Id$
*
* Copyright © 1999 Keith Packard
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
* the above copyright notice appear in all copies and that both that
* copyright notice and this permission notice appear in supporting
* documentation, and that the name of Keith Packard not be used in
* advertising or publicity pertaining to distribution of the software without
* specific, written prior permission. Keith Packard makes no
* representations about the suitability of this software for any purpose. It
* is provided "as is" without express or implied warranty.
*
* KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
* EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR
* CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
* DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
* TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
* PERFORMANCE OF THIS SOFTWARE.
*/
#include "kdrive.h"
/*
* These functions wrap the low-level fb rendering functions and
* synchronize framebuffer/accelerated drawing by stalling until
* the accelerator is idle
*/
void
KdCheckFillSpans (DrawablePtr pDrawable, GCPtr pGC, int nspans,
DDXPointPtr ppt, int *pwidth, int fSorted)
{
KdCheckSync (pDrawable->pScreen);
fbFillSpans (pDrawable, pGC, nspans, ppt, pwidth, fSorted);
}
void
KdCheckSetSpans (DrawablePtr pDrawable, GCPtr pGC, char *psrc,
DDXPointPtr ppt, int *pwidth, int nspans, int fSorted)
{
KdCheckSync (pDrawable->pScreen);
fbSetSpans (pDrawable, pGC, psrc, ppt, pwidth, nspans, fSorted);
}
void
KdCheckPutImage (DrawablePtr pDrawable, GCPtr pGC, int depth,
int x, int y, int w, int h, int leftPad, int format,
char *bits)
{
KdCheckSync (pDrawable->pScreen);
fbPutImage (pDrawable, pGC, depth, x, y, w, h, leftPad, format, bits);
}
RegionPtr
KdCheckCopyArea (DrawablePtr pSrc, DrawablePtr pDst, GCPtr pGC,
int srcx, int srcy, int w, int h, int dstx, int dsty)
{
KdCheckSync (pSrc->pScreen);
return fbCopyArea (pSrc, pDst, pGC, srcx, srcy, w, h, dstx, dsty);
}
RegionPtr
KdCheckCopyPlane (DrawablePtr pSrc, DrawablePtr pDst, GCPtr pGC,
int srcx, int srcy, int w, int h, int dstx, int dsty,
unsigned long bitPlane)
{
KdCheckSync (pSrc->pScreen);
return fbCopyPlane (pSrc, pDst, pGC, srcx, srcy, w, h, dstx, dsty,
bitPlane);
}
void
KdCheckPolyPoint (DrawablePtr pDrawable, GCPtr pGC, int mode, int npt,
DDXPointPtr pptInit)
{
KdCheckSync (pDrawable->pScreen);
fbPolyPoint (pDrawable, pGC, mode, npt, pptInit);
}
void
KdCheckPolylines (DrawablePtr pDrawable, GCPtr pGC,
int mode, int npt, DDXPointPtr ppt)
{
if (pGC->lineWidth == 0)
{
KdCheckSync (pDrawable->pScreen);
fbZeroLine (pDrawable, pGC, mode, npt, ppt);
}
else
{
if (pGC->lineStyle != LineSolid)
miWideDash (pDrawable, pGC, mode, npt, ppt);
else
miWideLine (pDrawable, pGC, mode, npt, ppt);
}
}
#if 0
void
KdCheckPolySegment (DrawablePtr pDrawable, GCPtr pGC,
int nsegInit, xSegment *pSegInit)
{
KdCheckSync(pDrawable->pScreen);
fbPolySegment (pDrawable, pGC, nsegInit, pSegInit);
}
void
KdCheckPolyRectangle (DrawablePtr pDrawable, GCPtr pGC,
int nrects, xRectangle *prect)
{
KdCheckSync(pDrawable->pScreen);
fbPolyRectangle (pDrawable, pGC, nrects, prect);
}
#endif
void
KdCheckPolyArc (DrawablePtr pDrawable, GCPtr pGC,
int narcs, xArc *pArcs)
{
if (pGC->lineWidth == 0)
{
KdCheckSync(pDrawable->pScreen);
fbPolyArc (pDrawable, pGC, narcs, pArcs);
}
else
miPolyArc (pDrawable, pGC, narcs, pArcs);
}
#if 0
void
KdCheckFillPolygon (DrawablePtr pDrawable, GCPtr pGC,
int shape, int mode, int count, DDXPointPtr pPts)
{
KdCheckSync(pDrawable->pScreen);
fbFillPolygon (pDrawable, pGC, mode, count, pPts);
}
#endif
void
KdCheckPolyFillRect (DrawablePtr pDrawable, GCPtr pGC,
int nrect, xRectangle *prect)
{
KdCheckSync(pDrawable->pScreen);
fbPolyFillRect (pDrawable, pGC, nrect, prect);
}
#if 0
void
KdCheckPolyFillArc (DrawablePtr pDrawable, GCPtr pGC,
int narcs, xArc *pArcs)
{
KdCheckSync(pDrawable->pScreen);
fbPolyFillArc (pDrawable, pGC, narcs, pArcs);
}
#endif
void
KdCheckImageGlyphBlt (DrawablePtr pDrawable, GCPtr pGC,
int x, int y, unsigned int nglyph,
CharInfoPtr *ppci, pointer pglyphBase)
{
KdCheckSync(pDrawable->pScreen);
fbImageGlyphBlt (pDrawable, pGC, x, y, nglyph, ppci, pglyphBase);
}
void
KdCheckPolyGlyphBlt (DrawablePtr pDrawable, GCPtr pGC,
int x, int y, unsigned int nglyph,
CharInfoPtr *ppci, pointer pglyphBase)
{
KdCheckSync(pDrawable->pScreen);
fbPolyGlyphBlt (pDrawable, pGC, x, y, nglyph, ppci, pglyphBase);
}
void
KdCheckPushPixels (GCPtr pGC, PixmapPtr pBitmap,
DrawablePtr pDrawable,
int w, int h, int x, int y)
{
KdCheckSync(pDrawable->pScreen);
fbPushPixels (pGC, pBitmap, pDrawable, w, h, x, y);
}
void
KdCheckGetImage (DrawablePtr pDrawable,
int x, int y, int w, int h,
unsigned int format, unsigned long planeMask,
char *d)
{
KdCheckSync(pDrawable->pScreen);
fbGetImage (pDrawable, x, y, w, h, format, planeMask, d);
}
void
KdCheckGetSpans (DrawablePtr pDrawable,
int wMax,
DDXPointPtr ppt,
int *pwidth,
int nspans,
char *pdstStart)
{
if (pDrawable->type != DRAWABLE_PIXMAP)
KdCheckSync(pDrawable->pScreen);
fbGetSpans (pDrawable, wMax, ppt, pwidth, nspans, pdstStart);
}
void
KdCheckSaveAreas (PixmapPtr pPixmap,
RegionPtr prgnSave,
int xorg,
int yorg,
WindowPtr pWin)
{
KdCheckSync(pWin->drawable.pScreen);
fbSaveAreas (pPixmap, prgnSave, xorg, yorg, pWin);
}
void
KdCheckRestoreAreas (PixmapPtr pPixmap,
RegionPtr prgnSave,
int xorg,
int yorg,
WindowPtr pWin)
{
KdCheckSync(pWin->drawable.pScreen);
fbRestoreAreas (pPixmap, prgnSave, xorg, yorg, pWin);
}
void
KdCheckPaintWindow (WindowPtr pWin, RegionPtr pRegion, int what)
{
KdCheckSync (pWin->drawable.pScreen);
fbPaintWindow (pWin, pRegion, what);
}
void
KdCheckCopyWindow (WindowPtr pWin, DDXPointRec ptOldOrg, RegionPtr prgnSrc)
{
KdCheckSync (pWin->drawable.pScreen);
fbCopyWindow (pWin, ptOldOrg, prgnSrc);
}
void
KdScreenInitAsync (ScreenPtr pScreen)
{
KdScreenPriv(pScreen);
pScreen->GetImage = KdCheckGetImage;
pScreen->GetSpans = KdCheckGetSpans;
pScreen->PaintWindowBackground = KdCheckPaintWindow;
pScreen->PaintWindowBorder = KdCheckPaintWindow;
pScreen->CopyWindow = KdCheckCopyWindow;
#ifndef FB_OLD_SCREEN
pScreen->BackingStoreFuncs.SaveAreas = KdCheckSaveAreas;
pScreen->BackingStoreFuncs.RestoreAreas = KdCheckRestoreAreas;
#else
pScreenPriv->BackingStoreFuncs.SaveAreas = KdCheckSaveAreas;
pScreenPriv->BackingStoreFuncs.RestoreAreas = KdCheckRestoreAreas;
#endif
}
/*
* Only need to stall for copyarea/copyplane
*/
const GCOps kdAsyncPixmapGCOps = {
fbFillSpans,
fbSetSpans,
fbPutImage,
KdCheckCopyArea,
KdCheckCopyPlane,
fbPolyPoint,
fbPolyLine,
miPolySegment,
miPolyRectangle,
fbPolyArc,
miFillPolygon,
fbPolyFillRect,
miPolyFillArc,
miPolyText8,
miPolyText16,
miImageText8,
miImageText16,
fbImageGlyphBlt,
fbPolyGlyphBlt,
fbPushPixels
#ifdef NEED_LINEHELPER
,NULL
#endif
};

View File

@ -21,9 +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: $ */ /* $XFree86: xc/programs/Xserver/hw/kdrive/kcolor.c,v 1.1 1999/11/19 13:53:48 hohndel Exp $ */
/* $XConsortium: oscolor.c,v 1.23 94/04/17 20:27:04 dpw Exp $ */
#include "kdrive.h" #include "kdrive.h"
#include <stdio.h> #include <stdio.h>
@ -45,7 +43,7 @@ KdToLower (unsigned char a)
} }
int int
KdStrCaseCmp (unsigned char *s1, unsigned char *s2, int l2) KdStrCaseCmp (const unsigned char *s1, const unsigned char *s2, int l2)
{ {
unsigned char c1, c2; unsigned char c1, c2;
@ -69,12 +67,12 @@ typedef struct _kdNamedColor {
unsigned short red; unsigned short red;
unsigned short green; unsigned short green;
unsigned short blue; unsigned short blue;
unsigned char *name; const unsigned char *name;
} KdNamedColor; } KdNamedColor;
#define C 0x101 #define C 0x101
KdNamedColor KdColors[] = { const KdNamedColor KdColors[] = {
240*C, 248*C, 255*C, "alice blue", 240*C, 248*C, 255*C, "alice blue",
240*C, 248*C, 255*C, "AliceBlue", 240*C, 248*C, 255*C, "AliceBlue",
250*C, 235*C, 215*C, "antique white", 250*C, 235*C, 215*C, "antique white",
@ -847,10 +845,10 @@ OsLookupColor(int screen,
unsigned short *pgreen, unsigned short *pgreen,
unsigned short *pblue) unsigned short *pblue)
{ {
KdNamedColor *c; const KdNamedColor *c;
unsigned char *name = (unsigned char *) s_name; unsigned char *name = (unsigned char *) s_name;
int low, mid, high; int low, mid, high;
int r; int r;
low = 0; low = 0;
high = NUM_KD_COLORS; high = NUM_KD_COLORS;

92
hw/kdrive/src/kcurscol.c Normal file
View File

@ -0,0 +1,92 @@
/*
* $Id$
*
* Copyright © 1999 Keith Packard
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
* the above copyright notice appear in all copies and that both that
* copyright notice and this permission notice appear in supporting
* documentation, and that the name of Keith Packard not be used in
* advertising or publicity pertaining to distribution of the software without
* specific, written prior permission. Keith Packard makes no
* representations about the suitability of this software for any purpose. It
* is provided "as is" without express or implied warranty.
*
* KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
* EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR
* CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
* DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
* TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
* PERFORMANCE OF THIS SOFTWARE.
*/
#include "kdrive.h"
#include "cursorstr.h"
static int
KdComputeCmapShift (unsigned long mask)
{
int shift;
unsigned long bit;
shift = 16;
bit = 0x80000000;
while (!(mask & bit))
{
shift--;
bit >>= 1;
}
return shift;
}
#define Shift(v,d) ((d) < 0 ? ((v) >> (-d)) : ((v) << (d)))
void
KdAllocateCursorPixels (ScreenPtr pScreen,
CursorPtr pCursor,
Pixel *source,
Pixel *mask)
{
xColorItem sourceColor, maskColor;
int r, g, b;
KdScreenPriv(pScreen);
if (pScreenPriv->screen->redMask)
{
r = KdComputeCmapShift (pScreenPriv->screen->redMask);
g = KdComputeCmapShift (pScreenPriv->screen->greenMask);
b = KdComputeCmapShift (pScreenPriv->screen->blueMask);
*source = ((Shift(pCursor->foreRed,r) & pScreenPriv->screen->redMask) |
(Shift(pCursor->foreGreen,g) & pScreenPriv->screen->greenMask) |
(Shift(pCursor->foreBlue,b) & pScreenPriv->screen->blueMask));
*mask = ((Shift(pCursor->backRed,r) & pScreenPriv->screen->redMask) |
(Shift(pCursor->backGreen,g) & pScreenPriv->screen->greenMask) |
(Shift(pCursor->backBlue,b) & pScreenPriv->screen->blueMask));
}
else
{
/*
* Set these to an invalid pixel value so that
* when the store colors comes through, the cursor
* won't get recolored
*/
*source = ~0;
*mask = ~0;
sourceColor.red = pCursor->foreRed;
sourceColor.green = pCursor->foreGreen;
sourceColor.blue = pCursor->foreBlue;
FakeAllocColor(pScreenPriv->pInstalledmap, &sourceColor);
maskColor.red = pCursor->backRed;
maskColor.green = pCursor->backGreen;
maskColor.blue = pCursor->backBlue;
FakeAllocColor(pScreenPriv->pInstalledmap, &maskColor);
FakeFreeColor(pScreenPriv->pInstalledmap, sourceColor.pixel);
FakeFreeColor(pScreenPriv->pInstalledmap, maskColor.pixel);
*source = sourceColor.pixel;
*mask = maskColor.pixel;
}
}

View File

@ -21,9 +21,12 @@
* 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: $ */ /* $XFree86: xc/programs/Xserver/hw/kdrive/kdrive.c,v 1.1 1999/11/19 13:53:48 hohndel Exp $ */
#include "kdrive.h" #include "kdrive.h"
#ifdef PSEUDO8
#include "pseudo8/pseudo8.h"
#endif
#include <mivalidate.h> #include <mivalidate.h>
#include <dixstruct.h> #include <dixstruct.h>
@ -41,8 +44,6 @@ Bool kdDisableZaphod;
Bool kdEnabled; Bool kdEnabled;
Bool kdSwitchPending; Bool kdSwitchPending;
void (*restoreHardware)(void);
/* /*
* Carry arguments from InitOutput through driver initialization * Carry arguments from InitOutput through driver initialization
* to KdScreenInit * to KdScreenInit
@ -54,6 +55,7 @@ extern WindowPtr *WindowTable;
void void
KdSetRootClip (ScreenPtr pScreen, BOOL enable) KdSetRootClip (ScreenPtr pScreen, BOOL enable)
{ {
#ifndef FB_OLD_SCREEN
WindowPtr pWin = WindowTable[pScreen->myNum]; WindowPtr pWin = WindowTable[pScreen->myNum];
WindowPtr pChild; WindowPtr pChild;
Bool WasViewable = (Bool)(pWin->viewable); Bool WasViewable = (Bool)(pWin->viewable);
@ -173,6 +175,7 @@ KdSetRootClip (ScreenPtr pScreen, BOOL enable)
} }
if (pWin->realized) if (pWin->realized)
WindowsRestructured (); WindowsRestructured ();
#endif /* !FB_OLD_SCREEN */
} }
void void
@ -182,7 +185,9 @@ KdDisableScreen (ScreenPtr pScreen)
if (!pScreenPriv->enabled) if (!pScreenPriv->enabled)
return; return;
KdSetRootClip (pScreen, FALSE); KdCheckSync (pScreen);
if (!pScreenPriv->closed)
KdSetRootClip (pScreen, FALSE);
KdDisableColormap (pScreen); KdDisableColormap (pScreen);
if (!pScreenPriv->screen->dumb) if (!pScreenPriv->screen->dumb)
(*pScreenPriv->card->cfuncs->disableAccel) (pScreen); (*pScreenPriv->card->cfuncs->disableAccel) (pScreen);
@ -332,7 +337,7 @@ Bool kdDumbDriver;
Bool kdSoftCursor; Bool kdSoftCursor;
int int
ddxProcessArgument (int argc, char **argv, int i) KdProcessArgument (int argc, char **argv, int i)
{ {
KdCardInfo *card; KdCardInfo *card;
KdScreenInfo *screen; KdScreenInfo *screen;
@ -398,7 +403,11 @@ ddxProcessArgument (int argc, char **argv, int i)
} }
if (!strcmp (argv[i], "-standalone")) if (!strcmp (argv[i], "-standalone"))
return 1; return 1;
#ifdef PSEUDO8
return p8ProcessArgument (argc, argv, i);
#else
return 0; return 0;
#endif
} }
/* /*
@ -443,6 +452,7 @@ KdCloseScreen (int index, ScreenPtr pScreen)
KdCardInfo *card = pScreenPriv->card; KdCardInfo *card = pScreenPriv->card;
Bool ret; Bool ret;
pScreenPriv->closed = TRUE;
pScreen->CloseScreen = pScreenPriv->CloseScreen; pScreen->CloseScreen = pScreenPriv->CloseScreen;
ret = (*pScreen->CloseScreen) (index, pScreen); ret = (*pScreen->CloseScreen) (index, pScreen);
@ -529,6 +539,7 @@ KdSaveScreen (ScreenPtr pScreen, int on)
Bool Bool
KdCreateWindow (WindowPtr pWin) KdCreateWindow (WindowPtr pWin)
{ {
#ifndef PHOENIX
if (!pWin->parent) if (!pWin->parent)
{ {
KdScreenPriv(pWin->drawable.pScreen); KdScreenPriv(pWin->drawable.pScreen);
@ -539,6 +550,7 @@ KdCreateWindow (WindowPtr pWin)
REGION_BREAK (pWin->drawable.pScreen, &pWin->clipList); REGION_BREAK (pWin->drawable.pScreen, &pWin->clipList);
} }
} }
#endif
return TRUE; return TRUE;
} }
@ -588,9 +600,13 @@ KdScreenInit(int index, ScreenPtr pScreen, int argc, char **argv)
pScreen->SaveScreen = KdSaveScreen; pScreen->SaveScreen = KdSaveScreen;
pScreen->CreateWindow = KdCreateWindow; pScreen->CreateWindow = KdCreateWindow;
if (!screen->dumb && card->cfuncs->initAccel) #ifdef FB_OLD_SCREEN
if (!(*card->cfuncs->initAccel) (pScreen)) pScreenPriv->BackingStoreFuncs.SaveAreas = fbSaveAreas;
screen->dumb = TRUE; pScreenPriv->BackingStoreFuncs.RestoreAreas = fbSaveAreas;
pScreenPriv->BackingStoreFuncs.SetClipmaskRgn = 0;
pScreenPriv->BackingStoreFuncs.GetImagePixmap = 0;
pScreenPriv->BackingStoreFuncs.GetSpansPixmap = 0;
#endif
if (!fbFinishScreenInit (pScreen, if (!fbFinishScreenInit (pScreen,
screen->frameBuffer, screen->frameBuffer,
@ -609,6 +625,24 @@ KdScreenInit(int index, ScreenPtr pScreen, int argc, char **argv)
pScreen->BlockHandler = KdBlockHandler; pScreen->BlockHandler = KdBlockHandler;
pScreen->WakeupHandler = KdWakeupHandler; pScreen->WakeupHandler = KdWakeupHandler;
if (card->cfuncs->initScreen)
if (!(*card->cfuncs->initScreen) (pScreen))
return FALSE;
if (!screen->dumb && card->cfuncs->initAccel)
if (!(*card->cfuncs->initAccel) (pScreen))
screen->dumb = TRUE;
#ifdef PSEUDO8
(void) p8Init (pScreen, PSEUDO8_USE_DEFAULT);
#endif
pScreen->backingStoreSupport = Always;
#ifdef FB_OLD_SCREEN
miInitializeBackingStore (pScreen, &pScreenPriv->BackingStoreFuncs);
#else
miInitializeBackingStore (pScreen);
#endif
/* /*
* Wrap CloseScreen, the order now is: * Wrap CloseScreen, the order now is:
* KdCloseScreen * KdCloseScreen
@ -683,17 +717,13 @@ Bool
KdSetPixmapFormats (ScreenInfo *pScreenInfo) KdSetPixmapFormats (ScreenInfo *pScreenInfo)
{ {
CARD8 depthToBpp[33]; /* depth -> bpp map */ CARD8 depthToBpp[33]; /* depth -> bpp map */
CARD8 bppToDepth[33]; /* bpp -> depth map */
KdCardInfo *card; KdCardInfo *card;
KdScreenInfo *screen; KdScreenInfo *screen;
int i; int i;
PixmapFormatRec *format; PixmapFormatRec *format;
for (i = 1; i <= 32; i++) for (i = 1; i <= 32; i++)
{
depthToBpp[i] = 0; depthToBpp[i] = 0;
bppToDepth[i] = 0;
}
/* /*
* Generate mappings between bitsPerPixel and depth, * Generate mappings between bitsPerPixel and depth,
@ -709,8 +739,6 @@ KdSetPixmapFormats (ScreenInfo *pScreenInfo)
depthToBpp[screen->depth] = screen->bitsPerPixel; depthToBpp[screen->depth] = screen->bitsPerPixel;
else if (depthToBpp[screen->depth] != screen->bitsPerPixel) else if (depthToBpp[screen->depth] != screen->bitsPerPixel)
return FALSE; return FALSE;
if (!bppToDepth[screen->bitsPerPixel])
bppToDepth[screen->bitsPerPixel] = screen->depth;
} }
} }
@ -718,11 +746,8 @@ KdSetPixmapFormats (ScreenInfo *pScreenInfo)
* Fill in additional formats * Fill in additional formats
*/ */
for (i = 0; i < NUM_KD_BPP; i++) for (i = 0; i < NUM_KD_BPP; i++)
if (!bppToDepth[kdBpp[i]] && !depthToBpp[kdBpp[i]]) if (!depthToBpp[kdBpp[i]])
{
bppToDepth[kdBpp[i]] = kdBpp[i];
depthToBpp[kdBpp[i]] = kdBpp[i]; depthToBpp[kdBpp[i]] = kdBpp[i];
}
pScreenInfo->imageByteOrder = IMAGE_BYTE_ORDER; pScreenInfo->imageByteOrder = IMAGE_BYTE_ORDER;
pScreenInfo->bitmapScanlineUnit = BITMAP_SCANLINE_UNIT; pScreenInfo->bitmapScanlineUnit = BITMAP_SCANLINE_UNIT;

View File

@ -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: $ */ /* $XFree86: xc/programs/Xserver/hw/kdrive/kdrive.h,v 1.1 1999/11/19 13:53:48 hohndel Exp $ */
#include <stdio.h> #include <stdio.h>
#include "X.h" #include "X.h"
@ -67,6 +67,7 @@ typedef struct _KdCardInfo {
struct _KdScreenInfo *screenList; struct _KdScreenInfo *screenList;
int selected; int selected;
struct _KdCardInfo *next; struct _KdCardInfo *next;
Bool needSync;
} KdCardInfo; } KdCardInfo;
extern KdCardInfo *kdCardInfo; extern KdCardInfo *kdCardInfo;
@ -98,6 +99,7 @@ typedef struct _KdScreenInfo {
typedef struct _KdCardFuncs { typedef struct _KdCardFuncs {
Bool (*cardinit) (KdCardInfo *); /* detect and map device */ Bool (*cardinit) (KdCardInfo *); /* detect and map device */
Bool (*scrinit) (KdScreenInfo *);/* initialize screen information */ Bool (*scrinit) (KdScreenInfo *);/* initialize screen information */
Bool (*initScreen) (ScreenPtr); /* initialize ScreenRec */
void (*preserve) (KdCardInfo *); /* save graphics card state */ void (*preserve) (KdCardInfo *); /* save graphics card state */
void (*enable) (ScreenPtr); /* set up for rendering */ void (*enable) (ScreenPtr); /* set up for rendering */
Bool (*dpms) (ScreenPtr, int); /* set DPMS screen saver */ Bool (*dpms) (ScreenPtr, int); /* set DPMS screen saver */
@ -114,6 +116,7 @@ typedef struct _KdCardFuncs {
Bool (*initAccel) (ScreenPtr); Bool (*initAccel) (ScreenPtr);
void (*enableAccel) (ScreenPtr); void (*enableAccel) (ScreenPtr);
void (*syncAccel) (ScreenPtr);
void (*disableAccel) (ScreenPtr); void (*disableAccel) (ScreenPtr);
void (*finiAccel) (ScreenPtr); void (*finiAccel) (ScreenPtr);
@ -129,6 +132,7 @@ typedef struct {
KdCardInfo *card; KdCardInfo *card;
Bool enabled; Bool enabled;
Bool closed;
int bytesPerPixel; int bytesPerPixel;
int dpmsState; int dpmsState;
@ -137,6 +141,9 @@ typedef struct {
xColorItem systemPalette[KD_MAX_PSEUDO_SIZE];/* saved windows colors */ xColorItem systemPalette[KD_MAX_PSEUDO_SIZE];/* saved windows colors */
CloseScreenProcPtr CloseScreen; CloseScreenProcPtr CloseScreen;
#ifdef FB_OLD_SCREEN
miBSFuncRec BackingStoreFuncs;
#endif
} KdPrivScreenRec, *KdPrivScreenPtr; } KdPrivScreenRec, *KdPrivScreenPtr;
typedef struct _KdMouseFuncs { typedef struct _KdMouseFuncs {
@ -163,6 +170,32 @@ typedef struct _KdOsFuncs {
void (*Fini) (void); void (*Fini) (void);
} KdOsFuncs; } KdOsFuncs;
typedef enum _KdSyncPolarity {
KdSyncNegative, KdSyncPositive
} KdSyncPolarity;
typedef struct _KdMonitorTiming {
/* label */
int horizontal;
int vertical;
int rate;
/* pixel clock */
int clock; /* in KHz */
/* horizontal timing */
int hfp; /* front porch */
int hbp; /* back porch */
int hblank; /* blanking */
KdSyncPolarity hpol; /* polarity */
/* vertical timing */
int vfp; /* front porch */
int vbp; /* back porch */
int vblank; /* blanking */
KdSyncPolarity vpol; /* polarity */
} KdMonitorTiming;
extern const KdMonitorTiming kdMonitorTimings[];
extern const int kdNumMonitorTimings;
/* /*
* This is the only completely portable way to * This is the only completely portable way to
* compute this info. * compute this info.
@ -190,6 +223,114 @@ extern KdOsFuncs *kdOsFuncs;
(pointer) v) (pointer) v)
#define KdScreenPriv(pScreen) KdPrivScreenPtr pScreenPriv = KdGetScreenPriv(pScreen) #define KdScreenPriv(pScreen) KdPrivScreenPtr pScreenPriv = KdGetScreenPriv(pScreen)
#define KdCheckSync(s) { \
KdScreenPriv(s); \
KdCardInfo *card = pScreenPriv->card; \
if (card->needSync) { \
card->needSync = FALSE; \
(*card->cfuncs->syncAccel) (s); \
} \
}
#define KdMarkSync(s) (KdGetScreenPriv(s)->card->needSync = TRUE)
/* kasync.c */
void
KdCheckFillSpans (DrawablePtr pDrawable, GCPtr pGC, int nspans,
DDXPointPtr ppt, int *pwidth, int fSorted);
void
KdCheckSetSpans (DrawablePtr pDrawable, GCPtr pGC, char *psrc,
DDXPointPtr ppt, int *pwidth, int nspans, int fSorted);
void
KdCheckPutImage (DrawablePtr pDrawable, GCPtr pGC, int depth,
int x, int y, int w, int h, int leftPad, int format,
char *bits);
RegionPtr
KdCheckCopyArea (DrawablePtr pSrc, DrawablePtr pDst, GCPtr pGC,
int srcx, int srcy, int w, int h, int dstx, int dsty);
RegionPtr
KdCheckCopyPlane (DrawablePtr pSrc, DrawablePtr pDst, GCPtr pGC,
int srcx, int srcy, int w, int h, int dstx, int dsty,
unsigned long bitPlane);
void
KdCheckPolyPoint (DrawablePtr pDrawable, GCPtr pGC, int mode, int npt,
DDXPointPtr pptInit);
void
KdCheckPolylines (DrawablePtr pDrawable, GCPtr pGC,
int mode, int npt, DDXPointPtr ppt);
#define KdCheckPolySegment miPolySegment
#define KdCheckPolyRectangle miPolyRectangle
void
KdCheckPolyArc (DrawablePtr pDrawable, GCPtr pGC,
int narcs, xArc *pArcs);
#define KdCheckFillPolygon miFillPolygon
void
KdCheckPolyFillRect (DrawablePtr pDrawable, GCPtr pGC,
int nrect, xRectangle *prect);
#define KdCheckPolyFillArc miPolyFillArc
void
KdCheckImageGlyphBlt (DrawablePtr pDrawable, GCPtr pGC,
int x, int y, unsigned int nglyph,
CharInfoPtr *ppci, pointer pglyphBase);
void
KdCheckPolyGlyphBlt (DrawablePtr pDrawable, GCPtr pGC,
int x, int y, unsigned int nglyph,
CharInfoPtr *ppci, pointer pglyphBase);
void
KdCheckPushPixels (GCPtr pGC, PixmapPtr pBitmap,
DrawablePtr pDrawable,
int w, int h, int x, int y);
void
KdCheckGetImage (DrawablePtr pDrawable,
int x, int y, int w, int h,
unsigned int format, unsigned long planeMask,
char *d);
void
KdCheckGetSpans (DrawablePtr pDrawable,
int wMax,
DDXPointPtr ppt,
int *pwidth,
int nspans,
char *pdstStart);
void
KdCheckSaveAreas (PixmapPtr pPixmap,
RegionPtr prgnSave,
int xorg,
int yorg,
WindowPtr pWin);
void
KdCheckRestoreAreas (PixmapPtr pPixmap,
RegionPtr prgnSave,
int xorg,
int yorg,
WindowPtr pWin);
void
KdScreenInitAsync (ScreenPtr pScreen);
void
KdCheckPaintWindow (WindowPtr pWin, RegionPtr pRegion, int what);
extern const GCOps kdAsyncPixmapGCOps;
/* knoop.c */ /* knoop.c */
extern GCOps kdNoopOps; extern GCOps kdNoopOps;
@ -215,6 +356,13 @@ KdListInstalledColormaps (ScreenPtr pScreen, Colormap *pCmaps);
void void
KdStoreColors (ColormapPtr pCmap, int ndef, xColorItem *pdefs); KdStoreColors (ColormapPtr pCmap, int ndef, xColorItem *pdefs);
/* kcurscol.c */
void
KdAllocateCursorPixels (ScreenPtr pScreen,
CursorPtr pCursor,
Pixel *source,
Pixel *mask);
/* kdrive.c */ /* kdrive.c */
extern miPointerScreenFuncRec kdPointerScreenFuncs; extern miPointerScreenFuncRec kdPointerScreenFuncs;
@ -347,6 +495,10 @@ extern KdMouseFuncs Ps2MouseFuncs;
extern KdKeyboardFuncs LinuxKeyboardFuncs; extern KdKeyboardFuncs LinuxKeyboardFuncs;
extern KdOsFuncs LinuxFuncs; extern KdOsFuncs LinuxFuncs;
extern KdMouseFuncs VxWorksMouseFuncs;
extern KdKeyboardFuncs VxWorksKeyboardFuncs;
extern KdOsFuncs VxWorksFuncs;
/* kmap.c */ /* kmap.c */
void * void *
KdMapDevice (CARD32 addr, CARD32 size); KdMapDevice (CARD32 addr, CARD32 size);
@ -354,9 +506,22 @@ KdMapDevice (CARD32 addr, CARD32 size);
void void
KdUnmapDevice (void *addr, CARD32 size); KdUnmapDevice (void *addr, CARD32 size);
/* kmode.c */
const KdMonitorTiming *
KdFindMode (KdScreenInfo *screen,
Bool (*supported) (KdScreenInfo *,
const KdMonitorTiming *));
Bool
KdTuneMode (KdScreenInfo *screen,
Bool (*usable) (KdScreenInfo *),
Bool (*supported) (KdScreenInfo *,
const KdMonitorTiming *));
/* ktest.c */ /* ktest.c */
Bool Bool
KdFrameBufferValid (CARD8 *base, int size); KdFrameBufferValid (CARD8 *base, int size);
int int
KdFrameBufferSize (CARD8 *base, int max); KdFrameBufferSize (CARD8 *base, int max);

View File

@ -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: $ */ /* $XFree86: xc/programs/Xserver/hw/kdrive/kinput.c,v 1.1 1999/11/19 13:53:49 hohndel Exp $ */
#include "kdrive.h" #include "kdrive.h"
#include "inputstr.h" #include "inputstr.h"
@ -134,10 +134,9 @@ KdAddFd (int fd)
flags |= FASYNC|NOBLOCK; flags |= FASYNC|NOBLOCK;
fcntl (fd, F_SETFL, flags); fcntl (fd, F_SETFL, flags);
AddEnabledDevice (fd); AddEnabledDevice (fd);
memset (&act, '\0', sizeof act);
act.sa_handler = KdSigio; act.sa_handler = KdSigio;
sigemptyset (&act.sa_mask); sigemptyset (&act.sa_mask);
act.sa_flags = 0;
act.sa_restorer = 0;
sigaction (SIGIO, &act, 0); sigaction (SIGIO, &act, 0);
sigemptyset (&set); sigemptyset (&set);
sigprocmask (SIG_SETMASK, &set, 0); sigprocmask (SIG_SETMASK, &set, 0);
@ -156,10 +155,9 @@ KdRemoveFd (int fd)
fcntl (fd, F_SETFL, flags); fcntl (fd, F_SETFL, flags);
if (kdnFds == 0) if (kdnFds == 0)
{ {
memset (&act, '\0', sizeof act);
act.sa_handler = SIG_IGN; act.sa_handler = SIG_IGN;
sigemptyset (&act.sa_mask); sigemptyset (&act.sa_mask);
act.sa_flags = 0;
act.sa_restorer = 0;
sigaction (SIGIO, &act, 0); sigaction (SIGIO, &act, 0);
} }
} }
@ -320,8 +318,8 @@ KdKeybdProc(DeviceIntPtr pDevice, int onoff)
extern KeybdCtrl defaultKeyboardControl; extern KeybdCtrl defaultKeyboardControl;
void static void
InitAutoRepeats (void) KdInitAutoRepeats (void)
{ {
int key_code; int key_code;
unsigned char mask; unsigned char mask;
@ -341,8 +339,8 @@ InitAutoRepeats (void)
} }
} }
void static void
InitModMap (void) KdInitModMap (void)
{ {
int key_code; int key_code;
int row; int row;
@ -412,8 +410,8 @@ KdInitInput(KdMouseFuncs *pMouseFuncs,
kdLeds = 0; kdLeds = 0;
kdBellPitch = 1000; kdBellPitch = 1000;
kdBellDuration = 200; kdBellDuration = 200;
InitModMap (); KdInitModMap ();
InitAutoRepeats (); KdInitAutoRepeats ();
KdResetInputMachine (); KdResetInputMachine ();
pPointer = AddInputDevice(KdMouseProc, TRUE); pPointer = AddInputDevice(KdMouseProc, TRUE);
pKeyboard = AddInputDevice(KdKeybdProc, TRUE); pKeyboard = AddInputDevice(KdKeybdProc, TRUE);
@ -421,6 +419,13 @@ KdInitInput(KdMouseFuncs *pMouseFuncs,
RegisterKeyboardDevice(pKeyboard); RegisterKeyboardDevice(pKeyboard);
miRegisterPointerDevice(screenInfo.screens[0], pPointer); miRegisterPointerDevice(screenInfo.screens[0], pPointer);
mieqInit(&pKeyboard->public, &pPointer->public); mieqInit(&pKeyboard->public, &pPointer->public);
#ifdef XINPUT
{
static long zero1, zero2;
SetExtInputCheck (&zero1, &zero2);
}
#endif
} }
/* /*
@ -1095,7 +1100,7 @@ KdEnqueueKeyboardEvent(unsigned char scan_code,
#define Press(b) SetButton(b+1,ButtonPress,"Down") #define Press(b) SetButton(b+1,ButtonPress,"Down")
#define Release(b) SetButton(b+1,ButtonRelease,"Up") #define Release(b) SetButton(b+1,ButtonRelease,"Up")
unsigned char ButtonState = 0; static unsigned char kdButtonState = 0;
/* /*
* kdEnqueueMouseEvent * kdEnqueueMouseEvent
@ -1146,7 +1151,7 @@ KdEnqueueMouseEvent(unsigned long flags, int x, int y)
buttons = flags; buttons = flags;
if ((ButtonState & KD_BUTTON_1) ^ (buttons & KD_BUTTON_1)) if ((kdButtonState & KD_BUTTON_1) ^ (buttons & KD_BUTTON_1))
{ {
if (buttons & KD_BUTTON_1) if (buttons & KD_BUTTON_1)
{ {
@ -1157,7 +1162,7 @@ KdEnqueueMouseEvent(unsigned long flags, int x, int y)
Release(0); Release(0);
} }
} }
if ((ButtonState & KD_BUTTON_2) ^ (buttons & KD_BUTTON_2)) if ((kdButtonState & KD_BUTTON_2) ^ (buttons & KD_BUTTON_2))
{ {
if (buttons & KD_BUTTON_2) if (buttons & KD_BUTTON_2)
{ {
@ -1168,7 +1173,7 @@ KdEnqueueMouseEvent(unsigned long flags, int x, int y)
Release(1); Release(1);
} }
} }
if ((ButtonState & KD_BUTTON_3) ^ (buttons & KD_BUTTON_3)) if ((kdButtonState & KD_BUTTON_3) ^ (buttons & KD_BUTTON_3))
{ {
if (buttons & KD_BUTTON_3) if (buttons & KD_BUTTON_3)
{ {
@ -1179,7 +1184,7 @@ KdEnqueueMouseEvent(unsigned long flags, int x, int y)
Release(2); Release(2);
} }
} }
ButtonState = buttons; kdButtonState = buttons;
} }
void void
@ -1328,4 +1333,3 @@ ProcessInputEvents ()
KdProcessSwitch (); KdProcessSwitch ();
KdCheckLock (); KdCheckLock ();
} }

View File

@ -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: $ */ /* $XFree86: xc/programs/Xserver/hw/kdrive/kmap.c,v 1.1 1999/11/19 13:53:50 hohndel Exp $ */
#include "kdrive.h" #include "kdrive.h"
@ -70,6 +70,9 @@ KdMapDevice (CARD32 addr, CARD32 size)
strerror (errno)); strerror (errno));
return a; return a;
#endif #endif
#ifdef VXWORKS
return (void *) addr;
#endif
} }
void void
@ -82,5 +85,8 @@ KdUnmapDevice (void *addr, CARD32 size)
#ifdef linux #ifdef linux
munmap (addr, size); munmap (addr, size);
#endif #endif
#ifdef VXWORKS
;
#endif
} }

313
hw/kdrive/src/kmode.c Normal file
View File

@ -0,0 +1,313 @@
/*
* $Id$
*
* Copyright 1999 SuSE, Inc.
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
* the above copyright notice appear in all copies and that both that
* copyright notice and this permission notice appear in supporting
* documentation, and that the name of SuSE not be used in advertising or
* publicity pertaining to distribution of the software without specific,
* written prior permission. SuSE makes no representations about the
* suitability of this software for any purpose. It is provided "as is"
* without express or implied warranty.
*
* SuSE DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL SuSE
* BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
* OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
* CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*
* Author: Keith Packard, SuSE, Inc.
*/
#include "kdrive.h"
const KdMonitorTiming kdMonitorTimings[] = {
/* H V Hz KHz */
/* FP BP BLANK POLARITY */
/* Other VESA modes */
{ 640, 350, 85, 31500, /* VESA */
32, 96, 192, KdSyncPositive, /* 37.861 */
32, 60, 95, KdSyncNegative, /* 85.080 */
},
{ 640, 400, 85, 31500, /* VESA */
32, 96, 192, KdSyncNegative, /* 37.861 */
1, 41, 45, KdSyncPositive, /* 85.080 */
},
{ 720, 400, 85, 35500, /* VESA */
36, 108, 216, KdSyncNegative, /* 37.927 */
1, 42, 46, KdSyncPositive, /* 85.039 */
},
/* 640x480 modes */
{ 640, 480, 85, 36000, /* VESA */
56, 80, 192, KdSyncNegative, /* 43.269 */
1, 25, 29, KdSyncNegative, /* 85.008 */
},
{ 640, 480, 75, 31500, /* VESA */
16, 120, 200, KdSyncNegative, /* 37.500 */
1, 16, 20, KdSyncNegative, /* 75.000 */
},
{ 640, 480, 72, 31500, /* VESA */
16, 120, 176, KdSyncNegative, /* 37.861 */
1, 20, 24, KdSyncNegative, /* 72.809 */
},
{ 640, 480, 60, 25175, /* VESA */
8, 40, 144, KdSyncNegative, /* 31.469 */
2, 25, 29, KdSyncNegative, /* 59.940 */
},
/* 800x600 modes */
{ 800, 600, 85, 56250, /* VESA */
32, 152, 248, KdSyncPositive, /* 53.674 */
1, 27, 31, KdSyncPositive, /* 85.061 */
},
{ 800, 600, 75, 49500, /* VESA */
16, 160, 256, KdSyncPositive, /* 46.875 */
1, 21, 25, KdSyncPositive, /* 75.000 */
},
/* DEFAULT */
#define MONITOR_TIMING_DEFAULT 9
{ 800, 600, 72, 50000, /* VESA */
56, 64, 240, KdSyncPositive, /* 48.077 */
37, 23, 66, KdSyncPositive, /* 72.188 */
},
{ 800, 600, 60, 40000, /* VESA */
40, 88, 256, KdSyncPositive, /* 37.879 */
1, 23, 28, KdSyncPositive, /* 60.317 */
},
{ 800, 600, 56, 36000, /* VESA */
24, 128, 224, KdSyncPositive, /* 35.156 */
1, 22, 25, KdSyncPositive, /* 56.250 */
},
/* 1024x768 modes */
{ 1024, 768, 85, 94500, /* VESA */
48, 208, 352, KdSyncPositive, /* 68.677 */
1, 36, 40, KdSyncPositive, /* 84.997 */
},
{ 1024, 768, 75, 78750, /* VESA */
16, 176, 288, KdSyncPositive, /* 60.023 */
1, 28, 32, KdSyncPositive, /* 75.029 */
},
{ 1024, 768, 70, 75000, /* VESA */
24, 144, 304, KdSyncNegative, /* 56.476 */
3, 29, 38, KdSyncNegative, /* 70.069 */
},
{ 1024, 768, 60, 65000, /* VESA */
24, 160, 320, KdSyncNegative, /* 48.363 */
3, 29, 38, KdSyncNegative, /* 60.004 */
},
/* 1152x864 mode */
{ 1152, 864, 75, 108000, /* VESA */
64, 256, 448, KdSyncPositive, /* 67.500 */
1, 32, 36, KdSyncPositive, /* 75.000 */
},
/* 1152x900 modes */
{ 1152, 900, 85, 122500, /* ADDED */
48, 208, 384, KdSyncPositive, /* 79.753 */
1, 32, 38, KdSyncPositive, /* 85.024 */
},
{ 1152, 900, 75, 108250, /* ADDED */
32, 208, 384, KdSyncPositive, /* 70.475 */
1, 32, 38, KdSyncPositive, /* 75.133 */
},
{ 1152, 900, 70, 100250, /* ADDED */
32, 208, 384, KdSyncPositive, /* 65.267 */
2, 32, 38, KdSyncPositive, /* 69.581 */
},
{ 1152, 900, 66, 95000, /* ADDED */
32, 208, 384, KdSyncPositive, /* 61.849 */
1, 32, 38, KdSyncPositive, /* 65.937 */
},
/* 1280x960 modes */
{ 1280, 960, 85, 148500, /* VESA */
64, 224, 448, KdSyncPositive, /* 85.938 */
1, 47, 51, KdSyncPositive, /* 85.002 */
},
{ 1280, 960, 60, 108000, /* VESA */
96, 312, 520, KdSyncPositive, /* 60.000 */
1, 36, 40, KdSyncPositive, /* 60.000 */
},
/* 1280x1024 modes */
{ 1280, 1024, 85, 157500, /* VESA */
64, 224, 448, KdSyncPositive, /* 91.146 */
1, 44, 48, KdSyncPositive, /* 85.024 */
},
{ 1280, 1024, 75, 135000, /* VESA */
16, 248, 408, KdSyncPositive, /* 79.976 */
1, 38, 42, KdSyncPositive, /* 75.025 */
},
{ 1280, 1024, 60, 108000, /* VESA */
48, 248, 408, KdSyncPositive, /* 63.981 */
1, 38, 42, KdSyncPositive, /* 60.020 */
},
/* 1600x1200 modes */
{ 1600, 1200, 85, 229500, /* VESA */
64, 304, 560, KdSyncPositive, /* 106.250 */
1, 46, 50, KdSyncPositive, /* 85.000 */
},
{ 1600, 1200, 75, 202500, /* VESA */
64, 304, 560, KdSyncPositive, /* 93.750 */
1, 46, 50, KdSyncPositive, /* 75.000 */
},
{ 1600, 1200, 70, 189000, /* VESA */
64, 304, 560, KdSyncPositive, /* 87.500 */
1, 46, 50, KdSyncPositive, /* 70.000 */
},
{ 1600, 1200, 65, 175500, /* VESA */
64, 304, 560, KdSyncPositive, /* 81.250 */
1, 46, 50, KdSyncPositive, /* 65.000 */
},
{ 1600, 1200, 60, 162000, /* VESA */
64, 304, 560, KdSyncPositive, /* 75.000 */
1, 46, 50, KdSyncPositive, /* 60.000 */
},
/* 1792x1344 modes */
{ 1792, 1344, 85, 301500, /* ADDED */
96, 352, 672, KdSyncNegative, /* 122.362 */
1, 92, 96, KdSyncPositive, /* 84.974 */
},
{ 1792, 1344, 75, 261000, /* VESA */
96, 352, 664, KdSyncNegative, /* 106.270 */
1, 69, 73, KdSyncPositive, /* 74.997 */
},
{ 1792, 1344, 60, 204750, /* VESA */
128, 328, 656, KdSyncNegative, /* 83.640 */
1, 46, 50, KdSyncPositive, /* 60.000 */
},
#if 0
{ 1800, 1012, 75 },
{ 1906, 1072, 68 },
#endif
/* 1856x1392 modes */
{ 1856, 1392, 85, 330500, /* ADDED */
160, 352, 736, KdSyncNegative, /* 127.508 */
1, 104, 108, KdSyncPositive, /* 85.001 */
},
{ 1856, 1392, 75, 288000, /* VESA */
128, 352, 704, KdSyncNegative, /* 112.500 */
1, 104, 108, KdSyncPositive, /* 75.000 */
},
{ 1856, 1392, 60, 218250, /* VESA */
96, 352, 672, KdSyncNegative, /* 86.333 */
1, 43, 47, KdSyncPositive, /* 59.995 */
},
/* 1920x1440 modes */
{ 1920, 1440, 85, 341750, /* ADDED */
160, 352, 760, KdSyncNegative, /* 127.512 */
1, 56, 60, KdSyncPositive, /* 85.012 */
},
{ 1920, 1440, 75, 297000, /* VESA */
144, 352, 720, KdSyncNegative, /* 112.500 */
1, 56, 60, KdSyncPositive, /* 75.000 */
},
{ 1920, 1440, 60, 234000, /* VESA */
128, 244, 680, KdSyncNegative, /* 90.000 */
1, 56, 60, KdSyncPositive, /* 60.000 */
},
};
#define NUM_MONITOR_TIMINGS (sizeof kdMonitorTimings/sizeof kdMonitorTimings[0])
const int kdNumMonitorTimings = NUM_MONITOR_TIMINGS;
const KdMonitorTiming *
KdFindMode (KdScreenInfo *screen,
Bool (*supported) (KdScreenInfo *,
const KdMonitorTiming *))
{
int i;
const KdMonitorTiming *t;
for (i = 0, t = kdMonitorTimings; i < NUM_MONITOR_TIMINGS; i++, t++)
{
if ((*supported) (screen, t) &&
t->horizontal == screen->width &&
t->vertical == screen->height &&
(!screen->rate || t->rate <= screen->rate))
{
return t;
}
}
return &kdMonitorTimings[MONITOR_TIMING_DEFAULT];
}
static const KdMonitorTiming *
kdFindPrevSize (const KdMonitorTiming *old)
{
const KdMonitorTiming *new, *prev;
if (old == kdMonitorTimings)
return 0;
new = old;
/*
* Search for the previous size
*/
while (new != kdMonitorTimings)
{
new--;
if (new->horizontal != old->horizontal &&
new->vertical != old->vertical)
{
break;
}
}
/*
* Match the refresh rate (<=)
*/
while (new != kdMonitorTimings)
{
prev = new - 1;
if (prev->horizontal == new->horizontal &&
prev->vertical == new->vertical &&
prev->rate > old->rate)
{
break;
}
new--;
}
return new;
}
Bool
KdTuneMode (KdScreenInfo *screen,
Bool (*usable) (KdScreenInfo *),
Bool (*supported) (KdScreenInfo *,
const KdMonitorTiming *))
{
const KdMonitorTiming *t, *new;
while (!(*usable) (screen))
{
/*
* Fix requested depth and geometry until it works
*/
if (screen->depth > 16)
screen->depth = 16;
else if (screen->depth > 8)
screen->depth = 8;
else
{
t = kdFindPrevSize (KdFindMode (screen, supported));
if (!t)
return FALSE;
screen->width = t->horizontal;
screen->height = t->vertical;
screen->rate = t->rate;
}
}
return TRUE;
}

View File

@ -21,22 +21,37 @@
* 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: $ */ /* $XFree86: xc/programs/Xserver/hw/kdrive/vga.c,v 1.1 1999/11/19 13:53:51 hohndel Exp $ */
#include "vga.h" #include "vga.h"
#include <stdio.h> #include <stdio.h>
#ifdef linux #ifdef linux
#define extern #define extern static
#include <asm/io.h> #include <asm/io.h>
#undef extern #undef extern
#define _VgaInb(r) inb(r) #define _VgaInb(r) inb(r)
#define _VgaOutb(v,r) outb(v,r) #define _VgaOutb(v,r) outb(v,r)
#define _VgaByteAddr(a) ((VGAVOL8 *) (a))
#define _VgaBytePort(a) (a)
#endif #endif
#if 0 #ifdef VXWORKS
#define _VgaInb(r) 0
#define _VgaOutb(v,r) 0
#define _VgaByteAddr(a) ((VGAVOL8 *) ((VGA32) (a) ^ 3))
#define _VgaBytePort(a) 0
#undef stderr
#define stderr stdout
#endif
#undef VGA_DEBUG_REGISTERS
#ifdef VGA_DEBUG_REGISTERS
#define VGA_DEBUG(a) fprintf a #define VGA_DEBUG(a) fprintf a
#else #else
#define VGA_DEBUG(a) #define VGA_DEBUG(a)
@ -54,27 +69,38 @@ VgaOutb (VGA8 v, VGA16 r)
_VgaOutb (v,r); _VgaOutb (v,r);
} }
VGA8
VgaReadMemb (VGA32 addr)
{
return *_VgaByteAddr(addr);
}
void
VgaWriteMemb (VGA8 v, VGA32 addr)
{
*_VgaByteAddr(addr) = v;
}
VGA8 VGA8
VgaFetch (VgaCard *card, VGA16 reg) VgaFetch (VgaCard *card, VGA16 reg)
{ {
VgaMap map; VgaMap map;
VGAVOL8 *mem;
VGA8 value; VGA8 value;
(*card->map) (card, reg, &map, VGAFALSE); (*card->map) (card, reg, &map, VGAFALSE);
switch (map.access) { switch (map.access) {
case VgaAccessMem: case VgaAccessMem:
mem = (VGAVOL8 *) map.port; value = VgaReadMemb (map.port);
value = *mem; VGA_DEBUG ((stderr, "%08x -> %2x\n", map.port, value));
break; break;
case VgaAccessIo: case VgaAccessIo:
value = _VgaInb (map.port); value = _VgaInb (map.port);
VGA_DEBUG ((stderr, "%4x -> %2x\n", map.port, value)); VGA_DEBUG ((stderr, "%4x -> %2x\n", map.port, value));
break; break;
case VgaAccessIndMem: case VgaAccessIndMem:
mem = (VGAVOL8 *) map.port; VgaWriteMemb (map.index, map.port + map.addr);
mem[map.addr] = map.index; value = VgaReadMemb (map.port + map.value);
value = mem[map.value]; VGA_DEBUG ((stderr, "%4x/%2x -> %2x\n", map.port, map.index, value));
break; break;
case VgaAccessIndIo: case VgaAccessIndIo:
_VgaOutb (map.index, map.port + map.addr); _VgaOutb (map.index, map.port + map.addr);
@ -93,23 +119,22 @@ void
VgaStore (VgaCard *card, VGA16 reg, VGA8 value) VgaStore (VgaCard *card, VGA16 reg, VGA8 value)
{ {
VgaMap map; VgaMap map;
VGAVOL8 *mem;
map.value = value; map.value = value;
(*card->map) (card, reg, &map, VGATRUE); (*card->map) (card, reg, &map, VGATRUE);
switch (map.access) { switch (map.access) {
case VgaAccessMem: case VgaAccessMem:
mem = (VGAVOL8 *) map.port; VGA_DEBUG ((stderr, "%8x <- %2x\n", map.port, value));
*mem = value; VgaWriteMemb (map.value, map.port);
break; break;
case VgaAccessIo: case VgaAccessIo:
VGA_DEBUG ((stderr, "%4x <- %2x\n", map.port, value)); VGA_DEBUG ((stderr, "%4x <- %2x\n", map.port, value));
_VgaOutb (value, map.port); _VgaOutb (value, map.port);
break; break;
case VgaAccessIndMem: case VgaAccessIndMem:
mem = (VGAVOL8 *) map.port; VgaWriteMemb (map.index, map.port + map.addr);
mem[map.addr] = map.index; VgaWriteMemb (value, map.port + map.value);
mem[map.value] = value; VGA_DEBUG ((stderr, "%4x/%2x <- %2x\n", map.port, map.index, value));
break; break;
case VgaAccessIndIo: case VgaAccessIndIo:
VGA_DEBUG ((stderr, "%4x/%2x <- %2x\n", map.port, map.index, value)); VGA_DEBUG ((stderr, "%4x/%2x <- %2x\n", map.port, map.index, value));
@ -167,6 +192,16 @@ VgaFinish (VgaCard *card)
card->values[id].flags = 0; card->values[id].flags = 0;
} }
void
VgaInvalidate (VgaCard *card)
{
VGA16 id;
for (id = 0; id < card->max; id++)
card->values[id].flags &= ~VGA_VALUE_VALID;
}
void void
_VgaSync (VgaCard *card, VGA16 id) _VgaSync (VgaCard *card, VGA16 id)
{ {

View File

@ -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: $ */ /* $XFree86: xc/programs/Xserver/hw/kdrive/vga.h,v 1.1 1999/11/19 13:53:51 hohndel Exp $ */
#ifndef _VGA_H_ #ifndef _VGA_H_
#define _VGA_H_ #define _VGA_H_
@ -93,6 +93,12 @@ VgaInb (VGA16 r);
void void
VgaOutb (VGA8 v, VGA16 r); VgaOutb (VGA8 v, VGA16 r);
VGA8
VgaReadMemb (VGA32 addr);
void
VgaWriteMemb (VGA8 v, VGA32 addr);
void void
VgaSetImm (VgaCard *card, VgaReg *reg, VGA32 value); VgaSetImm (VgaCard *card, VgaReg *reg, VGA32 value);
@ -114,6 +120,9 @@ VgaFill (VgaCard *card, VGA16 low, VGA16 high);
void void
VgaPreserve (VgaCard *card); VgaPreserve (VgaCard *card);
void
VgaInvalidate (VgaCard *card);
void void
VgaRestore (VgaCard *card); VgaRestore (VgaCard *card);

View File

@ -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: $ */ /* $XFree86: xc/programs/Xserver/hw/kdrive/trident/trident.c,v 1.1 1999/11/19 13:54:01 hohndel Exp $ */
#include "trident.h" #include "trident.h"
#define extern #define extern
@ -86,6 +86,12 @@ tridentScreenInit (KdScreenInfo *screen)
return TRUE; return TRUE;
} }
Bool
tridentInitScreen (ScreenPtr pScreen)
{
return fbdevInitScreen (pScreen);
}
CARD8 CARD8
tridentReadIndex (TridentCardInfo *tridentc, CARD16 port, CARD8 index) tridentReadIndex (TridentCardInfo *tridentc, CARD16 port, CARD8 index)
{ {
@ -255,6 +261,7 @@ tridentCardFini (KdCardInfo *card)
KdCardFuncs tridentFuncs = { KdCardFuncs tridentFuncs = {
tridentCardInit, /* cardinit */ tridentCardInit, /* cardinit */
tridentScreenInit, /* scrinit */ tridentScreenInit, /* scrinit */
tridentInitScreen, /* initScreen */
tridentPreserve, /* preserve */ tridentPreserve, /* preserve */
tridentEnable, /* enable */ tridentEnable, /* enable */
tridentDPMS, /* dpms */ tridentDPMS, /* dpms */
@ -271,6 +278,7 @@ KdCardFuncs tridentFuncs = {
tridentDrawInit, /* initAccel */ tridentDrawInit, /* initAccel */
tridentDrawEnable, /* enableAccel */ tridentDrawEnable, /* enableAccel */
tridentDrawSync, /* syncAccel */
tridentDrawDisable, /* disableAccel */ tridentDrawDisable, /* disableAccel */
tridentDrawFini, /* finiAccel */ tridentDrawFini, /* finiAccel */

View File

@ -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: $ */ /* $XFree86: xc/programs/Xserver/hw/kdrive/trident/trident.h,v 1.1 1999/11/19 13:54:01 hohndel Exp $ */
#ifndef _TRIDENT_H_ #ifndef _TRIDENT_H_
#define _TRIDENT_H_ #define _TRIDENT_H_
@ -61,13 +61,22 @@ typedef struct _cop {
#define COP_MULTI_TEXTURE_ADVANCED 0x20000000 #define COP_MULTI_TEXTURE_ADVANCED 0x20000000
#define COP_MULTI_MASK 0xf0000000 #define COP_MULTI_MASK 0xf0000000
#define COP_DEPTH_8 0x00000000 #define COP_DEPTH_8 0x00000000
#define COP_DEPTH_16 0x00000001 #define COP_DEPTH_16 0x00000001
#define COP_DEPTH_24_32 0x00000002 #define COP_DEPTH_24_32 0x00000002
#define COP_DEPTH_15 0x00000005 #define COP_DEPTH_15 0x00000005
#define COP_DEPTH_DITHER_DISABLE 0x00000008 #define COP_DEPTH_DITHER_DISABLE 0x00000008
#define COP_ALPHA_RESULT_ALPHA 0x00100000
#define COP_ALPHA_DEST_ALPHA 0x00200000
#define COP_ALPHA_SOURCE_ALPHA 0x00400000
#define COP_ALPHA_WRITE_ENABLE 0x00800000
#define COP_ALPHA_TEST_ENABLE 0x01000000
#define COP_ALPHA_BLEND_ENABLE 0x02000000
#define COP_ALPHA_DEST_VALUE 0x04000000
#define COP_ALPHA_SOURCE_VALUE 0x08000000
VOL32 command; /* 0x24 */ VOL32 command; /* 0x24 */
#define COP_OP_NULL 0x00000000 #define COP_OP_NULL 0x00000000
#define COP_OP_LINE 0x20000000 #define COP_OP_LINE 0x20000000
@ -173,6 +182,9 @@ tridentDrawInit (ScreenPtr pScreen);
void void
tridentDrawEnable (ScreenPtr pScreen); tridentDrawEnable (ScreenPtr pScreen);
void
tridentDrawSync (ScreenPtr pScreen);
void void
tridentDrawDisable (ScreenPtr pScreen); tridentDrawDisable (ScreenPtr pScreen);

View File

@ -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: $ */ /* $XFree86: xc/programs/Xserver/hw/kdrive/trident/tridentcurs.c,v 1.1 1999/11/19 13:54:01 hohndel Exp $ */
#include "trident.h" #include "trident.h"
#include "cursorstr.h" #include "cursorstr.h"
@ -82,39 +82,14 @@ tridentMoveCursor (ScreenPtr pScreen, int x, int y)
_tridentMoveCursor (pScreen, x, y); _tridentMoveCursor (pScreen, x, y);
} }
static void static void
tridentAllocCursorColors (ScreenPtr pScreen) tridentAllocCursorColors (ScreenPtr pScreen)
{ {
SetupCursor (pScreen); SetupCursor (pScreen);
CursorPtr pCursor = pCurPriv->pCursor; CursorPtr pCursor = pCurPriv->pCursor;
xColorItem sourceColor, maskColor;
/* KdAllocateCursorPixels (pScreen, pCursor,
* Set these to an invalid pixel value so that &pCurPriv->source, &pCurPriv->mask);
* when the store colors comes through, the cursor
* won't get recolored
*/
pCurPriv->source = ~0;
pCurPriv->mask = ~0;
/*
* XXX S3 bug workaround; s3 chip doesn't use RGB values from
* the cursor color registers as documented, rather it uses
* them to index the DAC. This is in the errata though.
*/
sourceColor.red = pCursor->foreRed;
sourceColor.green = pCursor->foreGreen;
sourceColor.blue = pCursor->foreBlue;
FakeAllocColor(pScreenPriv->pInstalledmap, &sourceColor);
maskColor.red = pCursor->backRed;
maskColor.green = pCursor->backGreen;
maskColor.blue = pCursor->backBlue;
FakeAllocColor(pScreenPriv->pInstalledmap, &maskColor);
FakeFreeColor(pScreenPriv->pInstalledmap, sourceColor.pixel);
FakeFreeColor(pScreenPriv->pInstalledmap, maskColor.pixel);
pCurPriv->source = sourceColor.pixel;
pCurPriv->mask = maskColor.pixel;
switch (pScreenPriv->screen->bitsPerPixel) { switch (pScreenPriv->screen->bitsPerPixel) {
case 4: case 4:
pCurPriv->source |= pCurPriv->source << 4; pCurPriv->source |= pCurPriv->source << 4;

View File

@ -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: $ */ /* $XFree86: xc/programs/Xserver/hw/kdrive/trident/tridentdraw.c,v 1.1 1999/11/19 13:54:01 hohndel Exp $ */
#include "trident.h" #include "trident.h"
#include "tridentdraw.h" #include "tridentdraw.h"
@ -84,7 +84,7 @@ tridentFillBoxSolid (DrawablePtr pDrawable, int nBox, BoxPtr pBox,
_tridentRect(cop,pBox->x1,pBox->y1,pBox->x2-1,pBox->y2-1,cmd); _tridentRect(cop,pBox->x1,pBox->y1,pBox->x2-1,pBox->y2-1,cmd);
pBox++; pBox++;
} }
_tridentWaitIdleEmpty(cop); KdMarkSync(pDrawable->pScreen);
} }
void void
@ -154,7 +154,7 @@ tridentCopyNtoN (DrawablePtr pSrcDrawable,
cop->command = cmd; cop->command = cmd;
pbox++; pbox++;
} }
_tridentWaitIdleEmpty(cop); KdMarkSync(pDstDrawable->pScreen);
} }
RegionPtr RegionPtr
@ -173,8 +173,8 @@ tridentCopyArea(DrawablePtr pSrcDrawable, DrawablePtr pDstDrawable, GCPtr pGC,
srcx, srcy, width, height, srcx, srcy, width, height,
dstx, dsty, tridentCopyNtoN, 0, 0); dstx, dsty, tridentCopyNtoN, 0, 0);
} }
return fbCopyArea (pSrcDrawable, pDstDrawable, pGC, return KdCheckCopyArea (pSrcDrawable, pDstDrawable, pGC,
srcx, srcy, width, height, dstx, dsty); srcx, srcy, width, height, dstx, dsty);
} }
BOOL BOOL
@ -217,7 +217,7 @@ tridentFillSpans (DrawablePtr pDrawable, GCPtr pGC, int n,
if (!tridentFillOk (pGC)) if (!tridentFillOk (pGC))
{ {
fbFillSpans (pDrawable, pGC, n, ppt, pwidth, fSorted); KdCheckFillSpans (pDrawable, pGC, n, ppt, pwidth, fSorted);
return; return;
} }
nTmp = n * miFindMaxBand(fbGetCompositeClip(pGC)); nTmp = n * miFindMaxBand(fbGetCompositeClip(pGC));
@ -261,10 +261,10 @@ tridentFillSpans (DrawablePtr pDrawable, GCPtr pGC, int n,
width = *pwidth++; width = *pwidth++;
if (width) if (width)
{ {
_tridentRect(cop,x,y,x + width,y,cmd); _tridentRect(cop,x,y,x + width - 1,y,cmd);
} }
} }
_tridentWaitIdleEmpty (cop); KdMarkSync(pDrawable->pScreen);
DEALLOCATE_LOCAL(pptFree); DEALLOCATE_LOCAL(pptFree);
DEALLOCATE_LOCAL(pwidthFree); DEALLOCATE_LOCAL(pwidthFree);
} }
@ -291,7 +291,7 @@ tridentPolyFillRect (DrawablePtr pDrawable, GCPtr pGC,
if (!tridentFillOk (pGC)) if (!tridentFillOk (pGC))
{ {
fbPolyFillRect (pDrawable, pGC, nrectFill, prectInit); KdCheckPolyFillRect (pDrawable, pGC, nrectFill, prectInit);
return; return;
} }
prgnClip = fbGetCompositeClip(pGC); prgnClip = fbGetCompositeClip(pGC);
@ -491,7 +491,7 @@ tridentSolidBoxClipped (DrawablePtr pDrawable,
_tridentRect(cop,partX1, partY1, partX2-1, partY2-1,cmd); _tridentRect(cop,partX1, partY1, partX2-1, partY2-1,cmd);
} }
_tridentWaitIdleEmpty(cop); KdMarkSync(pDrawable->pScreen);
} }
void void
@ -527,7 +527,7 @@ tridentImageGlyphBlt (DrawablePtr pDrawable,
depthMask = FbFullMask(pDrawable->depth); depthMask = FbFullMask(pDrawable->depth);
if ((pGC->planemask & depthMask) != depthMask) if ((pGC->planemask & depthMask) != depthMask)
{ {
fbImageGlyphBlt(pDrawable, pGC, x, y, nglyph, ppciInit, pglyphBase); KdCheckImageGlyphBlt(pDrawable, pGC, x, y, nglyph, ppciInit, pglyphBase);
return; return;
} }
glyph = 0; glyph = 0;
@ -575,6 +575,8 @@ tridentImageGlyphBlt (DrawablePtr pDrawable,
opaque = FALSE; opaque = FALSE;
} }
KdCheckSync (pDrawable->pScreen);
ppci = ppciInit; ppci = ppciInit;
while (nglyph--) while (nglyph--)
{ {
@ -623,25 +625,25 @@ tridentImageGlyphBlt (DrawablePtr pDrawable,
static const GCOps tridentOps = { static const GCOps tridentOps = {
tridentFillSpans, tridentFillSpans,
fbSetSpans, KdCheckSetSpans,
fbPutImage, KdCheckPutImage,
tridentCopyArea, tridentCopyArea,
fbCopyPlane, KdCheckCopyPlane,
fbPolyPoint, KdCheckPolyPoint,
fbPolyLine, KdCheckPolylines,
fbPolySegment, KdCheckPolySegment,
miPolyRectangle, miPolyRectangle,
fbPolyArc, KdCheckPolyArc,
miFillPolygon, miFillPolygon,
tridentPolyFillRect, tridentPolyFillRect,
fbPolyFillArc, KdCheckPolyFillArc,
miPolyText8, miPolyText8,
miPolyText16, miPolyText16,
miImageText8, miImageText8,
miImageText16, miImageText16,
tridentImageGlyphBlt, tridentImageGlyphBlt,
fbPolyGlyphBlt, KdCheckPolyGlyphBlt,
fbPushPixels, KdCheckPushPixels,
#ifdef NEED_LINEHELPER #ifdef NEED_LINEHELPER
,NULL ,NULL
#endif #endif
@ -657,7 +659,7 @@ tridentValidateGC (GCPtr pGC, Mask changes, DrawablePtr pDrawable)
if (pDrawable->type == DRAWABLE_WINDOW) if (pDrawable->type == DRAWABLE_WINDOW)
pGC->ops = (GCOps *) &tridentOps; pGC->ops = (GCOps *) &tridentOps;
else else
pGC->ops = (GCOps *) &fbGCOps; pGC->ops = (GCOps *) &kdAsyncPixmapGCOps;
} }
GCFuncs tridentGCFuncs = { GCFuncs tridentGCFuncs = {
@ -778,12 +780,16 @@ tridentPaintWindow(WindowPtr pWin, RegionPtr pRegion, int what)
#endif #endif
break; break;
} }
fbPaintWindow (pWin, pRegion, what); KdCheckPaintWindow (pWin, pRegion, what);
} }
Bool Bool
tridentDrawInit (ScreenPtr pScreen) tridentDrawInit (ScreenPtr pScreen)
{ {
/*
* Hook up asynchronous drawing
*/
KdScreenInitAsync (pScreen);
/* /*
* Replace various fb screen functions * Replace various fb screen functions
*/ */
@ -803,6 +809,7 @@ tridentDrawEnable (ScreenPtr pScreen)
CARD32 base; CARD32 base;
CARD16 stride; CARD16 stride;
CARD32 format; CARD32 format;
CARD32 alpha;
int tries; int tries;
stride = pScreenPriv->screen->pixelStride; stride = pScreenPriv->screen->pixelStride;
@ -845,7 +852,7 @@ tridentDrawEnable (ScreenPtr pScreen)
_tridentRect (cop, 0, 0, _tridentRect (cop, 0, 0,
pScreenPriv->screen->width, pScreenPriv->screen->height, pScreenPriv->screen->width, pScreenPriv->screen->height,
cmd); cmd);
_tridentWaitIdleEmpty (cop); KdMarkSync (pScreen);
} }
void void
@ -857,3 +864,11 @@ void
tridentDrawFini (ScreenPtr pScreen) tridentDrawFini (ScreenPtr pScreen)
{ {
} }
void
tridentDrawSync (ScreenPtr pScreen)
{
SetupTrident(pScreen);
_tridentWaitIdleEmpty(cop);
}

View File

@ -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: $ */ /* $XFree86: xc/programs/Xserver/hw/kdrive/trident/tridentdraw.h,v 1.1 1999/11/19 13:54:02 hohndel Exp $ */
#ifndef _TRIDENTDRAW_H_ #ifndef _TRIDENTDRAW_H_
#define _TRIDENTDRAW_H_ #define _TRIDENTDRAW_H_
@ -30,10 +30,13 @@
tridentCardInfo(pScreenPriv); \ tridentCardInfo(pScreenPriv); \
Cop *cop = tridentc->cop Cop *cop = tridentc->cop
#define TridentAlpha (COP_MULTI_ALPHA|COP_ALPHA_WRITE_ENABLE)
#define _tridentInit(cop,tridentc) { \ #define _tridentInit(cop,tridentc) { \
if ((cop)->status == 0xffffffff) tridentSetMMIO(tridentc); \ if ((cop)->status == 0xffffffff) tridentSetMMIO(tridentc); \
(cop)->multi = (tridentc)->cop_depth; \ (cop)->multi = (tridentc)->cop_depth; \
(cop)->multi = (tridentc)->cop_stride; \ (cop)->multi = (tridentc)->cop_stride; \
(cop)->multi = TridentAlpha; \
} \ } \
#define _tridentSetSolidRect(cop,pix,alu,cmd) {\ #define _tridentSetSolidRect(cop,pix,alu,cmd) {\
@ -56,7 +59,7 @@
#define _tridentWaitDone(cop) while ((cop)->status & COP_STATUS_BUSY) #define _tridentWaitDone(cop) while ((cop)->status & COP_STATUS_BUSY)
#define _tridentWaitIdleEmpty(cop) _tridentWaitDone(cop); #define _tridentWaitIdleEmpty(cop) _tridentWaitDone(cop)
#define sourceInvarient(alu) (((alu) & 3) == (((alu) >> 2) & 3)) #define sourceInvarient(alu) (((alu) & 3) == (((alu) >> 2) & 3))

View File

@ -22,7 +22,7 @@
* *
* Author: Keith Packard, SuSE, Inc. * Author: Keith Packard, SuSE, Inc.
*/ */
/* $XFree86: $ */ /* $XFree86: xc/programs/Xserver/hw/kdrive/trident/tridentstub.c,v 1.1 1999/11/19 13:54:02 hohndel Exp $ */
#include "trident.h" #include "trident.h"
@ -47,8 +47,8 @@ InitInput (int argc, char **argv)
KdInitInput (&Ps2MouseFuncs, &LinuxKeyboardFuncs); KdInitInput (&Ps2MouseFuncs, &LinuxKeyboardFuncs);
} }
void int
OsVendorInit (void) ddxProcessArgument (int argc, char **argv, int i)
{ {
KdOsInit (&LinuxFuncs); return KdProcessArgument (argc, argv, i);
} }

View File

@ -21,139 +21,13 @@
* 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: $ */ /* $XFree86: xc/programs/Xserver/hw/kdrive/trio/s3.c,v 1.1 1999/11/19 13:54:02 hohndel Exp $ */
#include "s3.h" #include "s3.h"
#define REGISTERS_OFFSET (0x1000000) #define REGISTERS_OFFSET (0x1000000)
#define PACKED_OFFSET (0x8100) #define PACKED_OFFSET (0x8100)
/*
* Clock synthesis:
*
* f_out = f_ref * ((M + 2) / ((N + 2) * (1 << R)))
*
* Constraints:
*
* 1. 135MHz <= f_ref * ((M + 2) / (N + 2)) <= 270 MHz
* 2. N >= 1
*
* Vertical refresh rate = clock / ((hsize + hblank) * (vsize + vblank))
* Horizontal refresh rate = clock / (hsize + hblank)
*/
#define DEFAULT_S3_TIMING 1
S3Timing s3Timings[] = {
/* FP BP BLANK */
/* M N R blank bios5 */
{ 640, 480, 60,
16, 48, 160, /* horizontal 31.321 KHz */
10, 33, 45, /* vertical 59.568 Hz */
26, 0, 3, /* pixel 25.057 MHz */
},
{ 800, 600, 85,
32, 152, 248, /* horizontal 53.673 KHz */
1, 27, 31, /* vertical 85.060 Hz */
108, 5, 2, /* pixel 56.249 MHz */
},
{ 800, 600, 75,
16, 160, 256, /* horizontal 46.891 KHz */
1, 21, 25, /* vertical 75.025 Hz */
81, 4, 2, /* pixel 49.516 MHz */
},
{ 800, 600, 72,
56, 64, 240, /* horizontal 48.186 KHz */
37, 23, 66, /* vertical 72.351 Hz */
26, 0, 2, /* pixel 50.113 MHz */
},
{ 1024, 768, 85,
48, 208, 352, /* horizontal 68.676 KHz */
1, 36, 40, /* vertical 84.996 Hz */
64, 3, 1, /* pixel 94.499 MHz */
},
{ 1024, 768, 75,
16, 176, 288, /* horizontal 60.022 KHz */
1, 28, 32, /* vertical 75.028 Hz */
20, 0, 1, /* pixel 78.749 MHz */
},
{ 1024, 768, 70,
24, 144, 304, /* horizontal 56.604 KHz */
3, 29, 38, /* vertical 70.227 Hz */
40, 2, 1, /* pixel 75.170 MHz */
},
{ 1024, 768, 66,
24, 144, 304, /* horizontal 53.234 KHz */
3, 29, 38, /* vertical 66.047 Hz */
77, 6, 1, /* pixel 70.695 MHz */
},
{ 1152, 900, 85,
48, 208, 384, /* horizontal 79.900 KHz */
1, 32, 38, /* vertical 85.181 Hz */
118, 5, 1, /* pixel 122.726 MHz */
},
{ 1152, 900, 75,
32, 208, 384, /* horizontal 70.495 Khz */
1, 32, 38, /* vertical 75.154 Hz */
119, 6, 1, /* pixel 108.280 MHz */
},
{ 1152, 900, 70,
32, 208, 384, /* horizontal 65.251 KHz */
2, 32, 38, /* vertical 69.564 Hz */
12, 0, 0, /* pixel 100.226 MHz */
},
{ 1152, 900, 66,
32, 208, 384, /* horizontal 61.817 KHz */
1, 32, 38, /* vertical 65.903 Hz */
124, 17, 0, /* pixel 94.951 MHz */
},
{ 1280, 1024, 85,
16, 248, 416, /* horizontal 90.561 KHz */
1, 40, 45, /* vertical 84.717 Hz */
116, 9, 0, /* pixel 153.593 MHz */
},
{ 1280, 1024, 75,
16, 248, 408, /* horizontal 80.255 KHz */
1, 38, 42, /* vertical 75.285 Hz */
111, 4, 1, /* pixel 134.828 MHz */
},
{ 1280, 1024, 70,
32, 248, 400, /* horizontal 74.573 KHz */
0, 36, 39, /* vertical 70.153 Hz */
68, 2, 1, /* pixel 125.283 MHz */
},
{ 1280, 1024, 66,
32, 248, 400, /* horizontal 70.007 KHz */
0, 36, 39, /* vertical 65.858 Hz */
113, 5, 1, /* pixel 117.612 MHz */
},
{ 1600, 1200, 85,
64, 304, 560, /* horizontal 106.059 KHz */
1, 46, 50, /* vertical 84.847 Hz */
126, 6, 0, /* pixel 229.088 MHz */
},
{ 1600, 1200, 75,
64, 304, 560, /* horizontal 93.748 KHz */
1, 46, 50, /* vertical 74.999 Hz */
97, 5, 0, /* pixel 202.497 MHz */
},
{ 1600, 1200, 70,
56, 304, 588, /* horizontal 87.524 KHz */
1, 46, 50, /* vertical 70.019 Hz */
105, 6, 0, /* pixel 191.503 MHz */
},
{ 1600, 1200, 65,
56, 308, 524, /* horizontal 80.050 KHz */
1, 38, 42, /* vertical 64.453 Hz */
93, 6, 0, /* pixel 170.026 MHz */
},
};
#define NUM_S3_TIMINGS (sizeof (s3Timings) / sizeof (s3Timings[0]))
CARD8 CARD8
_s3ReadIndexRegister (volatile CARD8 *base, CARD8 index) _s3ReadIndexRegister (volatile CARD8 *base, CARD8 index)
@ -245,20 +119,7 @@ _s3LoadCrtc (S3Ptr s3, S3Crtc *crtc)
crtc->dclk_value_high = GetSrtc (s3, 0x13); crtc->dclk_value_high = GetSrtc (s3, 0x13);
crtc->control_2 = GetSrtc (s3, 0x15); crtc->control_2 = GetSrtc (s3, 0x15);
crtc->ramdac_control = GetSrtc (s3, 0x18); crtc->ramdac_control = GetSrtc (s3, 0x18);
crtc->dclk_value_low_savage = GetSrtc (s3, 0x36);
crtc->dclk_pll_m0_savage_0_7 = GetSrtc (s3, 0x37);
crtc->dclk_pll_m1_savage_0_7 = GetSrtc (s3, 0x38);
crtc->extended_seq_39 = GetSrtc (s3, 0x39);
fprintf (stderr, "SR1A 0x%x SR1B 0x%x\n",
GetSrtc (s3, 0x1a),
GetSrtc (s3, 0x1b));
fprintf (stderr, "SR36 0x%x SR37 0x%x SR38 0x%x SR39 0x%x\n",
GetSrtc (s3, 0x36),
GetSrtc (s3, 0x37),
GetSrtc (s3, 0x38),
GetSrtc (s3, 0x39));
/* combine values */ /* combine values */
switch (crtc_ge_screen_width(crtc)) { switch (crtc_ge_screen_width(crtc)) {
@ -391,12 +252,8 @@ _s3SetDepth (S3Ptr s3, S3Crtc *crtc)
*/ */
save_3c2 = s3->crt_vga_3cc; save_3c2 = s3->crt_vga_3cc;
DRAW_DEBUG ((DEBUG_S3INIT, "save_3c2 0x%x", save_3c2)); DRAW_DEBUG ((DEBUG_S3INIT, "save_3c2 0x%x", save_3c2));
s3->crt_vga_3c2 = 0x0f; s3->crt_vga_3c2 = save_3c2 | 0x0c;
PutSrtc (s3, 0x36, crtc->dclk_value_low_savage);
PutSrtc (s3, 0x37, crtc->dclk_pll_m0_savage_0_7);
PutSrtc (s3, 0x38, crtc->dclk_pll_m1_savage_0_7);
PutSrtc (s3, 0x39, crtc->extended_seq_39);
PutSrtc(s3, 0x12, crtc->dclk_value_low); PutSrtc(s3, 0x12, crtc->dclk_value_low);
PutSrtc(s3, 0x13, crtc->dclk_value_high); PutSrtc(s3, 0x13, crtc->dclk_value_high);
@ -453,7 +310,6 @@ s3Reset (S3CardInfo *s3c)
s3->scissors_br = 0x0fff0fff; s3->scissors_br = 0x0fff0fff;
_s3WriteIndexRegister (&s3->crt_vga_3c4, 0x01, save->clock_mode); _s3WriteIndexRegister (&s3->crt_vga_3c4, 0x01, save->clock_mode);
PutSrtc(s3, 0x08, save->locksrtc);
PutCrtc(s3, 0x39, save->lock2); PutCrtc(s3, 0x39, save->lock2);
PutCrtc(s3, 0x38, save->lock1); PutCrtc(s3, 0x38, save->lock1);
@ -478,11 +334,6 @@ s3Save (S3CardInfo *s3c)
save->lock1 = GetCrtc(s3, 0x38); save->lock1 = GetCrtc(s3, 0x38);
save->lock2 = GetCrtc(s3, 0x39); save->lock2 = GetCrtc(s3, 0x39);
save->locksrtc = GetSrtc (s3, 0x08);
/* unlock srtc registers to read them */
PutSrtc (s3, 0x08, 0x06);
save->clock_mode = _s3ReadIndexRegister (&s3->crt_vga_3c4, 0x01); save->clock_mode = _s3ReadIndexRegister (&s3->crt_vga_3c4, 0x01);
_s3UnlockExt (s3); _s3UnlockExt (s3);
@ -502,10 +353,8 @@ s3CardInit (KdCardInfo *card)
S3Ptr s3; S3Ptr s3;
int size; int size;
CARD8 *registers; CARD8 *registers;
CARD32 s3FrameBuffer; CARD32 s3Address = card->attr.address[0];
CARD32 s3Registers;
CARD8 *temp_buffer; CARD8 *temp_buffer;
CARD32 max_memory;
DRAW_DEBUG ((DEBUG_S3INIT, "s3CardInit")); DRAW_DEBUG ((DEBUG_S3INIT, "s3CardInit"));
s3c = (S3CardInfo *) xalloc (sizeof (S3CardInfo)); s3c = (S3CardInfo *) xalloc (sizeof (S3CardInfo));
@ -519,23 +368,8 @@ s3CardInit (KdCardInfo *card)
card->driver = s3c; card->driver = s3c;
if (card->attr.naddr > 1) fprintf (stderr, "S3 at 0x%x\n", s3Address);
{ registers = KdMapDevice (s3Address + REGISTERS_OFFSET,
s3FrameBuffer = card->attr.address[1];
s3Registers = card->attr.address[0];
max_memory = 32 * 1024 * 1024;
s3c->savage = TRUE;
}
else
{
s3FrameBuffer = card->attr.address[0];
s3Registers = s3FrameBuffer + REGISTERS_OFFSET;
max_memory = 4 * 1024 * 1024;
s3c->savage = FALSE;
}
fprintf (stderr, "S3 at 0x%x/0x%x\n", s3Registers, s3FrameBuffer);
registers = KdMapDevice (s3Registers,
sizeof (S3) + PACKED_OFFSET); sizeof (S3) + PACKED_OFFSET);
if (!registers) if (!registers)
{ {
@ -546,34 +380,30 @@ s3CardInit (KdCardInfo *card)
s3c->registers = registers; s3c->registers = registers;
s3c->s3 = s3; s3c->s3 = s3;
#if 0
s3->crt_vga_3c3 = 1; /* wake up part from deep sleep */ s3->crt_vga_3c3 = 1; /* wake up part from deep sleep */
s3->crt_vga_3c2 = 0x01 | 0x02 | 0x0c; s3->crt_vga_3c2 = 0x01 | 0x02 | 0x0c;
s3->crt_vga_3c4 = 0x58; s3->crt_vga_3c4 = 0x58;
s3->crt_vga_3c5 = 0x10 | 0x3; s3->crt_vga_3c5 = 0x10 | 0x3;
#endif
/* /*
* Can't trust S3 register value for frame buffer amount, must compute * Can't trust S3 register value for frame buffer amount, must compute
*/ */
temp_buffer = KdMapDevice (s3FrameBuffer, max_memory); temp_buffer = KdMapDevice (s3Address, 4096 * 1024);
s3c->memory = KdFrameBufferSize (temp_buffer, max_memory); s3c->memory = KdFrameBufferSize (temp_buffer, 4096 * 1024);
fprintf (stderr, "Frame buffer 0x%x\n", s3c->memory);
DRAW_DEBUG ((DEBUG_S3INIT, "Detected frame buffer %d", s3c->memory)); DRAW_DEBUG ((DEBUG_S3INIT, "Detected frame buffer %d", s3c->memory));
KdUnmapDevice (temp_buffer, 4096 * 1024); KdUnmapDevice (temp_buffer, 4096 * 1024);
if (!s3c->memory) if (!s3c->memory)
{ {
ErrorF ("Can't detect s3 frame buffer at 0x%x\n", s3FrameBuffer); ErrorF ("Can't detect s3 frame buffer\n");
goto bail3; goto bail3;
} }
s3c->frameBuffer = KdMapDevice (s3FrameBuffer, s3c->memory); s3c->frameBuffer = KdMapDevice (s3Address, s3c->memory);
if (!s3c->frameBuffer) if (!s3c->frameBuffer)
{ {
ErrorF ("Can't map s3 frame buffer\n"); ErrorF ("Can't map s3 frame buffer\n");
@ -592,6 +422,60 @@ bail0:
return FALSE; return FALSE;
} }
Bool
s3ModeSupported (KdScreenInfo *screen,
const KdMonitorTiming *t)
{
if (t->horizontal != 1600 &&
t->horizontal != 1280 &&
t->horizontal != 1152 &&
t->horizontal != 800 &&
t->horizontal != 640)
return FALSE;
if (t->clock > S3_MAX_CLOCK * 2)
return FALSE;
}
Bool
s3ModeUsable (KdScreenInfo *screen)
{
KdCardInfo *card = screen->card;
S3CardInfo *s3c = (S3CardInfo *) card->driver;
int screen_size;
int pixel_width;
int byte_width;
if (screen->depth >= 24)
{
screen->depth = 24;
screen->bitsPerPixel = 32;
}
else if (screen->depth >= 16)
{
screen->depth = 16;
screen->bitsPerPixel = 16;
}
else if (screen->depth >= 15)
{
screen->depth = 15;
screen->bitsPerPixel = 16;
}
else
{
screen->depth = 8;
screen->bitsPerPixel = 8;
}
byte_width = screen->width * (screen->bitsPerPixel >> 3);
pixel_width = screen->width;
screen->pixelStride = pixel_width;
screen->byteStride = byte_width;
screen_size = byte_width * screen->height;
return screen_size <= s3c->memory;
}
Bool Bool
s3ScreenInit (KdScreenInfo *screen) s3ScreenInit (KdScreenInfo *screen)
{ {
@ -606,7 +490,7 @@ s3ScreenInit (KdScreenInfo *screen)
int pixel_width; int pixel_width;
int m, n, r; int m, n, r;
int i; int i;
S3Timing *t; const KdMonitorTiming *t;
DRAW_DEBUG ((DEBUG_S3INIT, "s3ScreenInit")); DRAW_DEBUG ((DEBUG_S3INIT, "s3ScreenInit"));
s3s = (S3ScreenInfo *) xalloc (sizeof (S3ScreenInfo)); s3s = (S3ScreenInfo *) xalloc (sizeof (S3ScreenInfo));
@ -626,29 +510,12 @@ s3ScreenInit (KdScreenInfo *screen)
DRAW_DEBUG ((DEBUG_S3INIT, "Requested parameters %dx%dx%d", DRAW_DEBUG ((DEBUG_S3INIT, "Requested parameters %dx%dx%d",
screen->width, screen->height, screen->rate)); screen->width, screen->height, screen->rate));
for (i = 0, t = s3Timings; i < NUM_S3_TIMINGS; i++, t++) t = KdFindMode (screen, s3ModeSupported);
{
DRAW_DEBUG ((DEBUG_S3INIT, "Available parameters %dx%dx%d",
t->horizontal, t->vertical, t->rate));
if (t->horizontal >= screen->width &&
t->vertical >= screen->height &&
(!screen->rate || t->rate <= screen->rate))
break;
}
if (i == NUM_S3_TIMINGS)
t = &s3Timings[DEFAULT_S3_TIMING];
screen->rate = t->rate; screen->rate = t->rate;
screen->width = t->horizontal; screen->width = t->horizontal;
screen->height = t->vertical; screen->height = t->vertical;
s3GetClock (t->clock, &m, &n, &r, 127, 31, 3);
#if 0 #if 0
s3GetClock (t, &m, &n, &r,
s3c->savage ? 511 : 127,
s3c->savage ? 127 : 31,
s3c->savage ? 4 : 3);
#else
s3GetClock (t, &m, &n, &r, 127, 31, 3);
#endif
#if 1
fprintf (stderr, "computed %d,%d,%d (%d) provided %d,%d,%d (%d)\n", fprintf (stderr, "computed %d,%d,%d (%d) provided %d,%d,%d (%d)\n",
m, n, r, S3_CLOCK(m,n,r), m, n, r, S3_CLOCK(m,n,r),
t->dac_m, t->dac_n, t->dac_r, t->dac_m, t->dac_n, t->dac_r,
@ -657,97 +524,13 @@ s3ScreenInit (KdScreenInfo *screen)
/* /*
* Can only operate in pixel-doubled mode at 8 bits per pixel * Can only operate in pixel-doubled mode at 8 bits per pixel
*/ */
if (s3c->savage) if (screen->depth > 8 && S3_CLOCK(m,n,r) > S3_MAX_CLOCK)
{ screen->depth = 8;
if (screen->depth > 16 && S3_CLOCK(m,n,r) > S3_MAX_CLOCK)
screen->depth = 16;
}
else
{
if (screen->depth > 8 && S3_CLOCK(m,n,r) > S3_MAX_CLOCK)
screen->depth = 8;
}
for (;;) if (!KdTuneMode (screen, s3ModeUsable, s3ModeSupported))
{ {
if (screen->depth >= 24) xfree (s3s);
{ return FALSE;
screen->depth = 24;
screen->bitsPerPixel = 32;
}
else if (screen->depth >= 16)
{
screen->depth = 16;
screen->bitsPerPixel = 16;
}
else if (screen->depth >= 15)
{
screen->depth = 15;
screen->bitsPerPixel = 16;
}
else
{
screen->depth = 8;
screen->bitsPerPixel = 8;
}
/* Normalize width to supported values */
if (screen->width >= 1600)
screen->width = 1600;
else if (screen->width >= 1280)
screen->width = 1280;
else if (screen->width >= 1152)
screen->width = 1152;
else if (screen->width >= 1024)
screen->width = 1024;
else if (screen->width >= 800)
screen->width = 800;
else
screen->width = 640;
byte_width = screen->width * (screen->bitsPerPixel >> 3);
pixel_width = screen->width;
screen->pixelStride = pixel_width;
screen->byteStride = byte_width;
screen_size = byte_width * screen->height;
if (screen_size <= s3c->memory)
break;
/*
* Fix requested depth and geometry until it works
*/
if (screen->depth > 16)
screen->depth = 16;
else if (screen->depth > 8)
screen->depth = 8;
else if (screen->width > 1152)
{
screen->width = 1152;
screen->height = 900;
}
else if (screen->width > 1024)
{
screen->width = 1024;
screen->height = 768;
}
else if (screen->width > 800)
{
screen->width = 800;
screen->height = 600;
}
else if (screen->width > 640)
{
screen->width = 640;
screen->height = 480;
}
else
{
xfree (s3s);
return FALSE;
}
} }
memory = s3c->memory - screen_size; memory = s3c->memory - screen_size;
@ -886,7 +669,7 @@ s3Enable (ScreenPtr pScreen)
int h_blank_extend_; int h_blank_extend_;
int i; int i;
CARD16 cursor_address; CARD16 cursor_address;
S3Timing *t; const KdMonitorTiming *t;
int m, n, r; int m, n, r;
DRAW_DEBUG ((DEBUG_S3INIT, "s3Enable")); DRAW_DEBUG ((DEBUG_S3INIT, "s3Enable"));
@ -894,17 +677,7 @@ s3Enable (ScreenPtr pScreen)
DRAW_DEBUG ((DEBUG_S3INIT, "requested bpp %d current %d", DRAW_DEBUG ((DEBUG_S3INIT, "requested bpp %d current %d",
pScreenPriv->bitsPerPixel, s3c->save.crtc.bits_per_pixel)); pScreenPriv->bitsPerPixel, s3c->save.crtc.bits_per_pixel));
for (i = 0; i < NUM_S3_TIMINGS; i++) t = KdFindMode (screen, s3ModeSupported);
{
t = &s3Timings[i];
if (t->horizontal == screen->width &&
t->vertical == screen->height &&
t->rate <= screen->rate)
break;
}
if (i == NUM_S3_TIMINGS)
t = &s3Timings[DEFAULT_S3_TIMING];
hfp = t->hfp; hfp = t->hfp;
hbp = t->hbp; hbp = t->hbp;
@ -919,58 +692,23 @@ s3Enable (ScreenPtr pScreen)
crtcR = s3c->save.crtc; crtcR = s3c->save.crtc;
crtc = &crtcR; crtc = &crtcR;
#if 0 s3GetClock (t->clock, &m, &n, &r, 127, 31, 3);
if (s3c->savage) crtc->dclk_pll_m_trio = m;
{ crtc->dclk_pll_n_trio = n;
m = ((int) crtc->dclk_pll_m_savage_8 << 8) | crtc->dclk_pll_m0_savage_0_7; crtc->dclk_pll_r_trio = r;
n = (crtc->dclk_pll_n_savage_6 << 6) | crtc->dclk_pll_n_savage_0_5;
r = (crtc->dclk_pll_r_savage_2 << 2) | crtc->dclk_pll_r_savage_0_1;
fprintf (stderr, "old clock %d, %d, %d\n", m, n, r);
s3GetClock (t, &m, &n, &r, 127, 31, 3);
#if 0
s3GetClock (t, &m, &n, &r, 511, 127, 4);
crtc->dclk_pll_m0_savage_0_7 = m;
crtc->dclk_pll_m1_savage_0_7 = m;
crtc->dclk_pll_m_savage_8 = m >> 8;
crtc->dclk_pll_n_savage_0_5 = n;
crtc->dclk_pll_n_savage_6 = n >> 6;
crtc->dclk_pll_r_savage_0_1 = r;
crtc->dclk_pll_r_savage_2 = r >> 2;
crtc->dclk_pll_select_savage = 1;
#endif
fprintf (stderr, "new clock %d, %d, %d\n", m, n, r);
}
else
{
s3GetClock (t, &m, &n, &r, 127, 31, 3);
crtc->dclk_pll_m_trio = m;
crtc->dclk_pll_n_trio = n;
crtc->dclk_pll_r_trio = r;
}
if (!s3c->savage) crtc->alt_refresh_count = 0x02;
{ crtc->enable_alt_refresh = 1;
crtc->alt_refresh_count = 0x02;
crtc->enable_alt_refresh = 1;
}
else
{
crtc->alt_refresh_count = 1;
crtc->enable_alt_refresh = 0;
}
crtc->enable_256_or_more = 1; crtc->enable_256_or_more = 1;
DRAW_DEBUG ((DEBUG_S3INIT, "memory_bus_size %d\n", crtc->memory_bus_size)); DRAW_DEBUG ((DEBUG_S3INIT, "memory_bus_size %d\n", crtc->memory_bus_size));
if (!s3c->savage) crtc->memory_bus_size = 1;
crtc->memory_bus_size = 1;
if (!s3c->savage) crtc->dclk_over_2 = 0;
crtc->dclk_over_2 = 0;
crtc->dclk_invert = 0; crtc->dclk_invert = 0;
crtc->enable_clock_double = 0; crtc->enable_clock_double = 0;
crtc->delay_blank = 0; crtc->delay_blank = 0;
if (!s3c->savage) crtc->extended_bios_5 = 0;
crtc->extended_bios_5 = 0;
/* /*
* Compute character lengths for horizontal timing values * Compute character lengths for horizontal timing values
*/ */
@ -987,11 +725,12 @@ s3Enable (ScreenPtr pScreen)
* Set up for double-pixel mode, switch color modes, * Set up for double-pixel mode, switch color modes,
* divide the dclk and delay h blank by 2 dclks * divide the dclk and delay h blank by 2 dclks
*/ */
if (S3_CLOCK(m, n, r) > S3_MAX_CLOCK) if (S3_CLOCK(crtc->dclk_pll_m_trio, crtc->dclk_pll_n_trio,
crtc->dclk_pll_r_trio) > S3_MAX_CLOCK)
{ {
DRAW_DEBUG ((DEBUG_S3INIT, "S3 clock %g > 80MHz, using pixel double mode", DRAW_DEBUG ((DEBUG_S3INIT, "S3 clock %g > 80MHz, using pixel double mode",
S3_CLOCK(crtc->dclk_pll_m, crtc->dclk_pll_n, S3_CLOCK(crtc->dclk_pll_m_trio, crtc->dclk_pll_n_trio,
crtc->dclk_pll_r))); crtc->dclk_pll_r_trio)));
crtc->color_mode = 1; crtc->color_mode = 1;
crtc->dclk_over_2 = 1; crtc->dclk_over_2 = 1;
crtc->enable_clock_double = 1; crtc->enable_clock_double = 1;
@ -1001,50 +740,18 @@ s3Enable (ScreenPtr pScreen)
h_adjust = 1; h_adjust = 1;
break; break;
case 16: case 16:
if (s3c->savage) hactive = screen->width / 4;
{ hblank /= 4;
hactive = screen->width / 4; hfp /= 4;
hblank /= 4; hbp /= 4;
hfp /= 4; h_screen_off = hactive;
hbp /= 4; crtc->pixel_length = 1;
h_screen_off = hactive * 2; crtc->extended_bios_5 = 2;
crtc->pixel_length = 1; if (crtc->depth == 15)
if (S3_CLOCK(m,n,r) > S3_MAX_CLOCK) crtc->color_mode = 3;
{
if (crtc->depth == 15)
crtc->color_mode = 3;
else
crtc->color_mode = 5;
crtc->dclk_over_2 = 1;
crtc->enable_clock_double = 1;
crtc->delay_blank = 2;
}
else
{
if (crtc->depth == 15)
crtc->color_mode = 2;
else
crtc->color_mode = 4;
crtc->dclk_over_2 = 0;
crtc->enable_clock_double = 0;
}
h_adjust = 1;
}
else else
{ crtc->color_mode = 5;
hactive = screen->width / 4; h_adjust = 2;
hblank /= 4;
hfp /= 4;
hbp /= 4;
h_screen_off = hactive;
crtc->pixel_length = 1;
crtc->extended_bios_5 = 2;
if (crtc->depth == 15)
crtc->color_mode = 3;
else
crtc->color_mode = 5;
h_adjust = 2;
}
break; break;
case 32: case 32:
hactive = screen->width / 8; hactive = screen->width / 8;
@ -1057,7 +764,6 @@ s3Enable (ScreenPtr pScreen)
h_adjust = 1; h_adjust = 1;
break; break;
} }
#endif
/* /*
* X server starts frame buffer at top of memory * X server starts frame buffer at top of memory
@ -1066,7 +772,6 @@ s3Enable (ScreenPtr pScreen)
crtc_start_address (crtc))); crtc_start_address (crtc)));
crtc_set_start_address (crtc, 0); crtc_set_start_address (crtc, 0);
#if 0
/* /*
* Compute horizontal register values from timings * Compute horizontal register values from timings
*/ */
@ -1119,7 +824,6 @@ s3Enable (ScreenPtr pScreen)
crtc_set_v_display_end (crtc, v_display_end); crtc_set_v_display_end (crtc, v_display_end);
crtc_set_v_blank_start (crtc, v_blank_start); crtc_set_v_blank_start (crtc, v_blank_start);
crtc->v_blank_end_0_7 = v_blank_end; crtc->v_blank_end_0_7 = v_blank_end;
#endif
/* /*
* Set cursor * Set cursor
@ -1277,6 +981,7 @@ s3CardFini (KdCardInfo *card)
KdCardFuncs s3Funcs = { KdCardFuncs s3Funcs = {
s3CardInit, s3CardInit,
s3ScreenInit, s3ScreenInit,
0,
s3Preserve, s3Preserve,
s3Enable, s3Enable,
s3DPMS, s3DPMS,
@ -1291,8 +996,15 @@ KdCardFuncs s3Funcs = {
s3RecolorCursor, s3RecolorCursor,
s3DrawInit, s3DrawInit,
s3DrawEnable, s3DrawEnable,
s3DrawSync,
s3DrawDisable, s3DrawDisable,
s3DrawFini, s3DrawFini,
s3GetColors, s3GetColors,
s3PutColors, s3PutColors,
}; };
void
S3InitCard (KdCardAttr *attr)
{
KdCardInfoAdd (&s3Funcs, attr, 0);
}

View File

@ -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: $ */ /* $XFree86: xc/programs/Xserver/hw/kdrive/trio/s3.h,v 1.1 1999/11/19 13:54:03 hohndel Exp $ */
#ifndef _S3_H_ #ifndef _S3_H_
#define _S3_H_ #define _S3_H_
@ -87,8 +87,7 @@ typedef volatile struct _s3 {
VOL32 alt_mix; /* 8134 */ VOL32 alt_mix; /* 8134 */
VOL32 scissors_tl; /* 8138 */ VOL32 scissors_tl; /* 8138 */
VOL32 scissors_br; /* 813c */ VOL32 scissors_br; /* 813c */
VOL16 pix_cntl; /* 8140 */ VOL32 pix_cntl_mult_misc2; /* 8140 */
VOL16 mult_misc2; /* 8142 */
VOL32 mult_misc_read_sel; /* 8144 */ VOL32 mult_misc_read_sel; /* 8144 */
VOL32 alt_pcnt; /* 8148 min_axis_pcnt, maj_axis_pcnt */ VOL32 alt_pcnt; /* 8148 min_axis_pcnt, maj_axis_pcnt */
VOL8 _pad3[0x19c]; /* 814c */ VOL8 _pad3[0x19c]; /* 814c */
@ -231,6 +230,7 @@ typedef volatile struct _s3 {
#define PATTERN_L 0x8000 #define PATTERN_L 0x8000
#define PATTERN_H 0x9000 #define PATTERN_H 0x9000
#define PIX_CNTL 0xa000 #define PIX_CNTL 0xa000
#define CONTROL_MISC2 0xd000
#define PIX_TRANS 0xe2e8 #define PIX_TRANS 0xe2e8
/* Advanced Function Control Regsiter */ /* Advanced Function Control Regsiter */
@ -347,13 +347,19 @@ typedef volatile struct _s3 {
#define FIFO_SLOTS 13 #define FIFO_SLOTS 13
#define GPSLOT(n) (1 << ((n) > 8 ? (15 - ((n) - 9)) : (8 - (n))))
/* Wait for n slots to become available */
#if 0 #if 0
/* Wait for one slot to become available */ #define _s3WaitSlots(s3,n) { \
#define _s3WaitSlot(s3) { \ DRAW_DEBUG ((DEBUG_CRTC, "_s3WaitSlots 0x%x %d", (s3)->cmd_gp_stat, n)); \
DRAW_DEBUG ((DEBUG_CRTC, "_s3WaitSlot 0x%x", (s3)->cmd_gp_stat)); \ while (((s3)->cmd_gp_stat & GPSLOT(n)) != 0); \
while ((s3)->cmd_gp_stat & GPBUSY_1) ; \ DRAW_DEBUG ((DEBUG_CRTC, " s3 0x%x %d slots ready", (s3)->cmd_gp_stat, n)); \
DRAW_DEBUG ((DEBUG_CRTC, " s3 slot available")); \
} }
#else
/* let PCI retries solve this problem */
#define _s3WaitSlots(s3,n)
#endif
/* Wait until queue is empty */ /* Wait until queue is empty */
#define _s3WaitEmpty(s3) { \ #define _s3WaitEmpty(s3) { \
@ -375,11 +381,6 @@ typedef volatile struct _s3 {
while ((s3)->cmd_gp_stat & GPBUSY) ; \ while ((s3)->cmd_gp_stat & GPBUSY) ; \
DRAW_DEBUG ((DEBUG_CRTC, " s3 idle")); \ DRAW_DEBUG ((DEBUG_CRTC, " s3 idle")); \
} }
#endif
#define _s3WaitSlot(s3)
#define _s3WaitEmpty(s3)
#define _s3WaitIdleEmpty(s3)
#define _s3WaitIdle(s3)
typedef struct _s3Cursor { typedef struct _s3Cursor {
int width, height; int width, height;
@ -1072,25 +1073,6 @@ typedef struct _crtc {
#define S3_MAX_CLOCK 135000 /* KHz */ #define S3_MAX_CLOCK 135000 /* KHz */
#endif #endif
typedef struct _s3Timing {
/* label */
int horizontal;
int vertical;
int rate;
/* horizontal timing */
int hfp; /* front porch */
int hbp; /* back porch */
int hblank; /* blanking */
/* vertical timing */
int vfp; /* front porch */
int vbp; /* back porch */
int vblank; /* blanking */
/* clock values */
int dac_m;
int dac_n;
int dac_r;
} S3Timing;
typedef struct _s3Save { typedef struct _s3Save {
CARD8 cursor_fg; CARD8 cursor_fg;
CARD8 cursor_bg; CARD8 cursor_bg;
@ -1112,6 +1094,7 @@ typedef struct _s3CardInfo {
CARD8 *registers; /* pointer to register map */ CARD8 *registers; /* pointer to register map */
S3Save save; S3Save save;
Bool savage; Bool savage;
Bool need_sync;
} S3CardInfo; } S3CardInfo;
typedef struct _s3ScreenInfo { typedef struct _s3ScreenInfo {
@ -1148,6 +1131,7 @@ void s3RecolorCursor (ScreenPtr pScreen, int ndef, xColorItem *pdefs);
Bool s3DrawInit (ScreenPtr pScreen); Bool s3DrawInit (ScreenPtr pScreen);
void s3DrawEnable (ScreenPtr pScreen); void s3DrawEnable (ScreenPtr pScreen);
void s3DrawSync (ScreenPtr pScreen);
void s3DrawDisable (ScreenPtr pScreen); void s3DrawDisable (ScreenPtr pScreen);
void s3DrawFini (ScreenPtr pScreen); void s3DrawFini (ScreenPtr pScreen);
@ -1156,7 +1140,7 @@ void s3PutColors (ScreenPtr pScreen, int ndef, xColorItem *pdefs);
void S3InitCard (KdCardAttr *attr); void S3InitCard (KdCardAttr *attr);
void s3GetClock (S3Timing *t, int *Mp, int *Np, int *Rp, int maxM, int maxN, int maxR); void s3GetClock (int target, int *Mp, int *Np, int *Rp, int maxM, int maxN, int maxR);
CARD8 _s3ReadIndexRegister (VOL8 *base, CARD8 index); CARD8 _s3ReadIndexRegister (VOL8 *base, CARD8 index);
void _s3WriteIndexRegister (VOL8 *base, CARD8 index, CARD8 value); void _s3WriteIndexRegister (VOL8 *base, CARD8 index, CARD8 value);
@ -1209,30 +1193,4 @@ extern KdCardFuncs s3Funcs;
#define S3_TILE_SIZE 8 #define S3_TILE_SIZE 8
/*
* Ok, so the S3 is broken -- it expects bitmaps to come MSB bit order,
* but it's willing to take them in LSB byte order. These macros
* flip bits around without flipping bytes. Instead of using a table
* and burning memory bandwidth, do them in place with the CPU.
*/
/* The MIPS compiler automatically places these constants in registers */
#define S3InvertBits32(v) { \
v = ((v & 0x55555555) << 1) | ((v >> 1) & 0x55555555); \
v = ((v & 0x33333333) << 2) | ((v >> 2) & 0x33333333); \
v = ((v & 0x0f0f0f0f) << 4) | ((v >> 4) & 0x0f0f0f0f); \
}
#define S3InvertBits16(v) { \
v = ((v & 0x5555) << 1) | ((v >> 1) & 0x5555); \
v = ((v & 0x3333) << 2) | ((v >> 2) & 0x3333); \
v = ((v & 0x0f0f) << 4) | ((v >> 4) & 0x0f0f); \
}
#define S3InvertBits8(v) { \
v = ((v & 0x55) << 1) | ((v >> 1) & 0x55); \
v = ((v & 0x33) << 2) | ((v >> 2) & 0x33); \
v = ((v & 0x0f) << 4) | ((v >> 4) & 0x0f); \
}
#endif /* _S3_H_ */ #endif /* _S3_H_ */

View File

@ -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: $ */ /* $XFree86: xc/programs/Xserver/hw/kdrive/trio/s3clock.c,v 1.1 1999/11/19 13:54:03 hohndel Exp $ */
#include "s3.h" #include "s3.h"
@ -44,16 +44,12 @@
#define MAX_VCO 360000.0 #define MAX_VCO 360000.0
void void
s3GetClock (S3Timing *t, int *Mp, int *Np, int *Rp, int maxM, int maxN, int maxR) s3GetClock (int target, int *Mp, int *Np, int *Rp, int maxM, int maxN, int maxR)
{ {
int M, N, R, bestM, bestN; int M, N, R, bestM, bestN;
int f_vco, f_out; int f_vco, f_out;
int target;
int err, abserr, besterr; int err, abserr, besterr;
target = ((t->horizontal + t->hblank) *
(t->vertical + t->vblank) *
t->rate) / 1000;
/* /*
* Compute correct R value to keep VCO in range * Compute correct R value to keep VCO in range
*/ */

View File

@ -21,9 +21,10 @@
* 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: $ */ /* $XFree86: xc/programs/Xserver/hw/kdrive/trio/s3curs.c,v 1.1 1999/11/19 13:54:06 hohndel Exp $ */
#include "s3.h" #include "s3.h"
#include "s3draw.h"
#include "cursorstr.h" #include "cursorstr.h"
#define SetupCursor(s) KdScreenPriv(s); \ #define SetupCursor(s) KdScreenPriv(s); \
@ -94,31 +95,8 @@ s3AllocCursorColors (ScreenPtr pScreen)
CursorPtr pCursor = pCurPriv->pCursor; CursorPtr pCursor = pCurPriv->pCursor;
xColorItem sourceColor, maskColor; xColorItem sourceColor, maskColor;
/* KdAllocateCursorPixels (pScreen, pCursor,
* Set these to an invalid pixel value so that &pCurPriv->source, &pCurPriv->mask);
* when the store colors comes through, the cursor
* won't get recolored
*/
pCurPriv->source = ~0;
pCurPriv->mask = ~0;
/*
* XXX S3 bug workaround; s3 chip doesn't use RGB values from
* the cursor color registers as documented, rather it uses
* them to index the DAC. This is in the errata though.
*/
sourceColor.red = pCursor->foreRed;
sourceColor.green = pCursor->foreGreen;
sourceColor.blue = pCursor->foreBlue;
FakeAllocColor(pScreenPriv->pInstalledmap, &sourceColor);
maskColor.red = pCursor->backRed;
maskColor.green = pCursor->backGreen;
maskColor.blue = pCursor->backBlue;
FakeAllocColor(pScreenPriv->pInstalledmap, &maskColor);
FakeFreeColor(pScreenPriv->pInstalledmap, sourceColor.pixel);
FakeFreeColor(pScreenPriv->pInstalledmap, maskColor.pixel);
pCurPriv->source = sourceColor.pixel;
pCurPriv->mask = maskColor.pixel;
switch (pScreenPriv->screen->bitsPerPixel) { switch (pScreenPriv->screen->bitsPerPixel) {
case 4: case 4:
pCurPriv->source |= pCurPriv->source << 4; pCurPriv->source |= pCurPriv->source << 4;
@ -192,8 +170,9 @@ s3LoadCursor (ScreenPtr pScreen, int x, int y)
CursorBitsPtr bits = pCursor->bits; CursorBitsPtr bits = pCursor->bits;
int w, h; int w, h;
unsigned char r[2], g[2], b[2]; unsigned char r[2], g[2], b[2];
unsigned short *ram, *msk, *mskLine, *src, *srcLine; unsigned long *ram;
unsigned short and, xor; unsigned long *msk, *mskLine, *src, *srcLine;
unsigned long and, xor;
int i, j; int i, j;
int cursor_address; int cursor_address;
int wsrc; int wsrc;
@ -204,11 +183,6 @@ s3LoadCursor (ScreenPtr pScreen, int x, int y)
*/ */
s3AllocCursorColors (pScreen); s3AllocCursorColors (pScreen);
/*
* Lock S3 so the cursor doesn't move while we're setting it
*/
LockS3(s3c);
pCurPriv->pCursor = pCursor; pCurPriv->pCursor = pCursor;
pCurPriv->xhot = pCursor->bits->xhot; pCurPriv->xhot = pCursor->bits->xhot;
pCurPriv->yhot = pCursor->bits->yhot; pCurPriv->yhot = pCursor->bits->yhot;
@ -216,24 +190,25 @@ s3LoadCursor (ScreenPtr pScreen, int x, int y)
/* /*
* Stick new image into cursor memory * Stick new image into cursor memory
*/ */
ram = (unsigned short *) s3s->cursor_base; ram = (unsigned long *) s3s->cursor_base;
mskLine = (unsigned short *) bits->mask; mskLine = (unsigned long *) bits->mask;
srcLine = (unsigned short *) bits->source; srcLine = (unsigned long *) bits->source;
h = bits->height; h = bits->height;
if (h > S3_CURSOR_HEIGHT) if (h > S3_CURSOR_HEIGHT)
h = S3_CURSOR_HEIGHT; h = S3_CURSOR_HEIGHT;
wsrc = BitmapBytePad(bits->width) / 2; /* words per line */ wsrc = BitmapBytePad(bits->width) / 4; /* ulongs per line */
for (i = 0; i < S3_CURSOR_HEIGHT; i++) { for (i = 0; i < S3_CURSOR_HEIGHT; i++)
{
msk = mskLine; msk = mskLine;
src = srcLine; src = srcLine;
mskLine += wsrc; mskLine += wsrc;
srcLine += wsrc; srcLine += wsrc;
for (j = 0; j < S3_CURSOR_WIDTH / 16; j++) { for (j = 0; j < S3_CURSOR_WIDTH / 32; j++) {
unsigned short m, s; unsigned long m, s;
if (i < h && j < wsrc) if (i < h && j < wsrc)
{ {
@ -244,14 +219,14 @@ s3LoadCursor (ScreenPtr pScreen, int x, int y)
} }
else else
{ {
and = 0xffff; and = 0xffffffff;
xor = 0x0000; xor = 0x00000000;
} }
S3InvertBits16(and); S3AdjustBits32(and);
*ram++ = and; S3AdjustBits32(xor);
S3InvertBits16(xor); *ram++ = (and & 0xffff) | (xor << 16);
*ram++ = xor; *ram++ = (and >> 16) | (xor & 0xffff0000);
} }
} }
@ -302,7 +277,11 @@ s3RealizeCursor (ScreenPtr pScreen, CursorPtr pCursor)
{ {
if (pCursor) if (pCursor)
{ {
int x, y; #ifdef FB_OLD_SCREEN
short x, y;
#else
int x, y;
#endif
miPointerPosition (&x, &y); miPointerPosition (&x, &y);
s3LoadCursor (pScreen, x, y); s3LoadCursor (pScreen, x, y);
@ -397,7 +376,11 @@ s3CursorEnable (ScreenPtr pScreen)
{ {
if (pCurPriv->pCursor) if (pCurPriv->pCursor)
{ {
int x, y; #ifdef FB_OLD_SCREEN
short x, y;
#else
int x, y;
#endif
miPointerPosition (&x, &y); miPointerPosition (&x, &y);
s3LoadCursor (pScreen, x, y); s3LoadCursor (pScreen, x, y);

View File

@ -22,7 +22,7 @@
* *
* Author: Keith Packard, SuSE, Inc. * Author: Keith Packard, SuSE, Inc.
*/ */
/* $XFree86: $ */ /* $XFree86: xc/programs/Xserver/hw/kdrive/trio/s3stub.c,v 1.1 1999/11/19 13:54:06 hohndel Exp $ */
#include "s3.h" #include "s3.h"
@ -52,8 +52,8 @@ InitInput (int argc, char **argv)
KdInitInput (&Ps2MouseFuncs, &LinuxKeyboardFuncs); KdInitInput (&Ps2MouseFuncs, &LinuxKeyboardFuncs);
} }
void int
OsVendorInit (void) ddxProcessArgument (int argc, char **argv, int i)
{ {
KdOsInit (&LinuxFuncs); return KdProcessArgument (argc, argv, i);
} }

View File

@ -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: $ */ /* $XFree86: xc/programs/Xserver/hw/kdrive/ts300/ts300.c,v 1.1 1999/11/19 13:54:06 hohndel Exp $ */
#include "kdrive.h" #include "kdrive.h"
@ -123,9 +123,8 @@ InitInput (int argc, char **argv)
KdInitInput (&Ps2MouseFuncs, &LinuxKeyboardFuncs); KdInitInput (&Ps2MouseFuncs, &LinuxKeyboardFuncs);
} }
void int
OsVendorInit (void) ddxProcessArgument (int argc, char **argv, int i)
{ {
KdOsInit (&LinuxFuncs); return KdProcessArgument (argc, argv, i);
} }

View File

@ -0,0 +1,15 @@
XCOMM $XFree86: $
#include <Server.tmpl>
SRCS = vxworks.c vxkbd.c vxkmouse.c
OBJS = vxworks.o vxkbd.o vxkmouse.o
INCLUDES = -I. -I.. -I$(XBUILDINCDIR) -I$(FONTINCSRC) \
-I../../../fb -I../../../mi -I../../../include -I../../../os \
-I$(EXTINCSRC) -I$(XINCLUDESRC)
NormalLibraryObjectRule()
NormalLibraryTarget(vxworks,$(OBJS))
DependTarget()

262
hw/kdrive/vxworks/vxkbd.c Normal file
View File

@ -0,0 +1,262 @@
/*
* $Id$
*
* Copyright © 1999 Network Computing Devices, Inc. All rights reserved.
*
* Author: Keith Packard
*/
#include "kdrive.h"
#include "kkeymap.h"
#include <X11/keysym.h>
#include <inputstr.h>
#define VXWORKS_WIDTH 2
KeySym VxWorksKeymap[] = {
/*7 f1 */ XK_F1, NoSymbol,
/*8 escape */ XK_Escape, NoSymbol,
NoSymbol, NoSymbol,
NoSymbol, NoSymbol,
NoSymbol, NoSymbol,
NoSymbol, NoSymbol,
/*13 tab */ XK_Tab, NoSymbol,
/*14 ` */ XK_grave, XK_asciitilde,
/*15 f2 */ XK_F2, NoSymbol,
NoSymbol, NoSymbol,
/*17 lctrl */ XK_Control_L, NoSymbol,
/*18 lshift */ XK_Shift_L, NoSymbol,
NoSymbol, NoSymbol,
/*20 lock */ XK_Caps_Lock, NoSymbol,
/*21 q */ XK_Q, NoSymbol,
/*22 1 */ XK_1, XK_exclam,
/*23 f3 */ XK_F3, NoSymbol,
NoSymbol, NoSymbol,
/*25 lalt */ XK_Meta_L, XK_Alt_L,
/*26 z */ XK_Z, NoSymbol,
/*27 s */ XK_S, NoSymbol,
/*28 a */ XK_A, NoSymbol,
/*29 w */ XK_W, NoSymbol,
/*30 2 */ XK_2, XK_at,
/*31 f4 */ XK_F4, NoSymbol,
NoSymbol, NoSymbol,
/*33 c */ XK_C, NoSymbol,
/*34 x */ XK_X, NoSymbol,
/*35 d */ XK_D, NoSymbol,
/*36 e */ XK_E, NoSymbol,
/*37 4 */ XK_4, XK_dollar,
/*38 3 */ XK_3, XK_numbersign,
/*39 f5 */ XK_F5, NoSymbol,
NoSymbol, NoSymbol,
/*41 space */ XK_space, NoSymbol,
/*42 v */ XK_V, NoSymbol,
/*43 f */ XK_F, NoSymbol,
/*44 t */ XK_T, NoSymbol,
/*45 r */ XK_R, NoSymbol,
/*46 5 */ XK_5, XK_percent,
/*47 f6 */ XK_F6, NoSymbol,
NoSymbol, NoSymbol,
/*49 n */ XK_N, NoSymbol,
/*50 b */ XK_B, NoSymbol,
/*51 h */ XK_H, NoSymbol,
/*52 g */ XK_G, NoSymbol,
/*53 y */ XK_Y, NoSymbol,
/*54 6 */ XK_6, XK_asciicircum,
/*55 f7 */ XK_F7, NoSymbol,
NoSymbol, NoSymbol,
/*57 ralt */ XK_Meta_R, XK_Alt_R,
/*58 m */ XK_M, NoSymbol,
/*59 j */ XK_J, NoSymbol,
/*60 u */ XK_U, NoSymbol,
/*61 7 */ XK_7, XK_ampersand,
/*62 8 */ XK_8, XK_asterisk,
/*63 f8 */ XK_F8, NoSymbol,
NoSymbol, NoSymbol,
/*65 , */ XK_comma, XK_less,
/*66 k */ XK_K, NoSymbol,
/*67 i */ XK_I, NoSymbol,
/*68 o */ XK_O, NoSymbol,
/*69 0 */ XK_0, XK_parenright,
/*70 9 */ XK_9, XK_parenleft,
/*71 f9 */ XK_F9, NoSymbol,
NoSymbol, NoSymbol,
/*73 . */ XK_period, XK_greater,
/*74 / */ XK_slash, XK_question,
/*75 l */ XK_L, NoSymbol,
/*76 ; */ XK_semicolon, XK_colon,
/*77 p */ XK_P, NoSymbol,
/*78 - */ XK_minus, XK_underscore,
/*79 f10 */ XK_F10, NoSymbol,
NoSymbol, NoSymbol,
NoSymbol, NoSymbol,
/*82 ' */ XK_apostrophe, XK_quotedbl,
NoSymbol, NoSymbol,
/*84 [ */ XK_bracketleft, XK_braceleft,
/*85 = */ XK_equal, XK_plus,
/*86 f11 */ XK_F11, NoSymbol,
/*87 sysrq */ XK_Sys_Req, XK_Print,
/*88 rctrl */ XK_Control_R, NoSymbol,
/*89 rshift */ XK_Shift_R, NoSymbol,
/*90 enter */ XK_Return, NoSymbol,
/*91 ] */ XK_bracketright, XK_braceright,
/*92 \ */ XK_backslash, XK_bar,
NoSymbol, NoSymbol,
/*94 f12 */ XK_F12, NoSymbol,
/*95 scrolllock*/ XK_Scroll_Lock, NoSymbol,
/*96 down */ XK_Down, NoSymbol,
/*97 left */ XK_Left, NoSymbol,
/*98 pause */ XK_Break, XK_Pause,
/*99 up */ XK_Up, NoSymbol,
/*100 delete */ XK_Delete, NoSymbol,
/*101 end */ XK_End, NoSymbol,
/*102 bs */ XK_BackSpace, NoSymbol,
/*103 insert */ XK_Insert, NoSymbol,
NoSymbol, NoSymbol,
/*105 np 1 */ XK_KP_End, XK_KP_1,
/*106 right */ XK_Right, NoSymbol,
/*107 np 4 */ XK_KP_Left, XK_KP_4,
/*108 np 7 */ XK_KP_Home, XK_KP_7,
/*109 pgdn */ XK_Page_Down, NoSymbol,
/*110 home */ XK_Home, NoSymbol,
/*111 pgup */ XK_Page_Up, NoSymbol,
/*112 np 0 */ XK_KP_Insert, XK_KP_0,
/*113 np . */ XK_KP_Delete, XK_KP_Decimal,
/*114 np 2 */ XK_KP_Down, XK_KP_2,
/*115 np 5 */ XK_KP_5, NoSymbol,
/*116 np 6 */ XK_KP_Right, XK_KP_6,
/*117 np 8 */ XK_KP_Up, XK_KP_8,
/*118 numlock */ XK_Num_Lock, NoSymbol,
/*119 np / */ XK_KP_Divide, NoSymbol,
NoSymbol, NoSymbol,
/*121 np enter */ XK_KP_Enter, NoSymbol,
/*122 np 3 */ XK_KP_Page_Down, XK_KP_3,
NoSymbol, NoSymbol,
/*124 np + */ XK_KP_Add, NoSymbol,
/*125 np 9 */ XK_KP_Page_Up, XK_KP_9,
/*126 np * */ XK_KP_Multiply, NoSymbol,
NoSymbol, NoSymbol,
NoSymbol, NoSymbol,
NoSymbol, NoSymbol,
NoSymbol, NoSymbol,
NoSymbol, NoSymbol,
/*132 np - */ XK_KP_Subtract, NoSymbol,
NoSymbol, NoSymbol,
NoSymbol, NoSymbol,
NoSymbol, NoSymbol,
NoSymbol, NoSymbol,
NoSymbol, NoSymbol,
NoSymbol, NoSymbol,
/*139 lwin */ XK_Super_L, NoSymbol,
/*140 rwin */ XK_Super_R, NoSymbol,
/*141 menu */ XK_Menu, NoSymbol,
};
void
VxWorksKeyboardLoad (void)
{
KeySym *k;
kdMinScanCode = 7;
kdKeymapWidth = VXWORKS_WIDTH;
kdMaxScanCode = 141;
memcpy (kdKeymap, VxWorksKeymap, sizeof (VxWorksKeymap));
}
static int kbdFd = -1;
#include <errno.h>
#include <event.h>
#include <kbd_ioctl.h>
extern KeybdCtrl defaultKeyboardControl;
static void
VxWorksSetAutorepeat (unsigned char *repeats, Bool on)
{
int i;
unsigned char mask;
int scan_code;
int key_code;
unsigned char realkc;
if (on)
{
realkc = 1;
ioctl (kbdFd, KBD_ALL_REPEAT, &realkc);
for (scan_code = 7; scan_code <= 141; scan_code++)
{
key_code = scan_code + 1;
i = key_code >> 3;
mask = 1 << (key_code & 7);
if ((repeats[i] & mask) == 0)
{
realkc = scan_code;
ioctl (kbdFd, KBD_NO_REPEAT, &realkc);
}
}
}
else
{
realkc = 0;
ioctl (kbdFd, KBD_ALL_REPEAT, &realkc);
}
}
int
VxWorksKeyboardInit (void)
{
kbdFd = open ("/dev/kbd", O_RDONLY, 0);
if (kbdFd < 0)
ErrorF ("keyboard open failure %d\n", errno);
VxWorksSetAutorepeat (defaultKeyboardControl.autoRepeats, TRUE);
return -1;
}
void
VxWorksKeyboardFini (int fd)
{
if (kbdFd >= 0)
{
close (kbdFd);
kbdFd = -1;
}
}
void
VxWorksKeyboardRead (int fd)
{
}
void
VxWorksKeyboardLeds (int leds)
{
DeviceIntPtr pKeyboard = (DeviceIntPtr) LookupKeyboardDevice ();
KeybdCtrl *ctrl = &pKeyboard->kbdfeed->ctrl;
led_ioctl_info led_info;
int i;
VxWorksSetAutorepeat (ctrl->autoRepeats, ctrl->autoRepeat);
for (i = 0; i < 3; i++)
{
led_info.bit_n = 1 << i;
led_info.OFF_or_ON = (leds & (1 << i)) != 0;
led_info.reversed = 0;
ioctl (kbdFd, KBD_SET_LED, &led_info);
}
}
void
VxWorksKeyboardBell (int volume, int frequency, int duration)
{
}
KdKeyboardFuncs VxWorksKeyboardFuncs = {
VxWorksKeyboardLoad,
VxWorksKeyboardInit,
VxWorksKeyboardRead,
VxWorksKeyboardLeds,
VxWorksKeyboardBell,
VxWorksKeyboardFini,
3,
};

121
hw/kdrive/vxworks/vxmouse.c Normal file
View File

@ -0,0 +1,121 @@
/*
* $Id$
*
* Copyright © 1999 Network Computing Devices, Inc. All rights reserved.
*
* Author: Keith Packard
*/
#define NEED_EVENTS
#include "X.h"
#include "Xproto.h"
#include "inputstr.h"
#include "scrnintstr.h"
#include "kdrive.h"
#include "Xpoll.h"
#include <event.h>
#include <smem.h>
static unsigned long mouseState;
#define BUTTON1 0x01
#define BUTTON2 0x02
#define BUTTON3 0x04
#include <errno.h>
static int mouseFd = -1;
static eventqueue *eventQueue;
void
VxMouseRead (int mousePort)
{
Event ev;
int dx, dy;
unsigned long flags;
unsigned long mask;
int n;
while (eventQueue->head != eventQueue->tail)
{
ev = *eventQueue->head;
if (eventQueue->head >= &eventQueue->events[eventQueue->size-1])
eventQueue->head = &eventQueue->events[0];
else
eventQueue->head++;
switch (ev.e_type) {
case E_BUTTON:
switch (ev.e_device) {
case E_MOUSE:
switch (ev.e_key) {
case BUTTON1:
mask = KD_BUTTON_1;
break;
case BUTTON2:
mask = KD_BUTTON_2;
break;
case BUTTON3:
mask = KD_BUTTON_3;
break;
default:
mask = 0;
break;
}
if (ev.e_direction == E_KBUP)
mouseState &= ~mask;
else
mouseState |= mask;
KdEnqueueMouseEvent (mouseState | KD_MOUSE_DELTA, 0, 0);
break;
case E_DKB:
KdEnqueueKeyboardEvent (ev.e_key, ev.e_direction == E_KBUP);
break;
}
break;
case E_MMOTION:
KdEnqueueMouseEvent (mouseState | KD_MOUSE_DELTA,
ev.e_x, ev.e_y);
break;
}
}
}
int
VxMouseInit (void)
{
int mousePort;
unsigned long ev_size;
mouseState = 0;
mousePort = open ("/dev/xdev", O_RDONLY, 0);
if (mousePort < 0)
ErrorF ("event port open failure %d\n", errno);
mouseFd = open ("/dev/mouse", O_RDONLY, 0);
if (mouseFd < 0)
ErrorF ("mouse open failure %d\n", errno);
if (eventQueue == 0)
{
ioctl (mousePort, EVENT_QUEUE_SMSIZE, &ev_size);
eventQueue = (eventqueue *) smem_get ("event", ev_size, (SM_READ|SM_WRITE));
}
return mousePort;
}
void
VxMouseFini (int mousePort)
{
if (mousePort >= 0)
close (mousePort);
if (mouseFd >= 0)
{
close (mouseFd);
mouseFd = -1;
}
}
KdMouseFuncs VxWorksMouseFuncs = {
VxMouseInit,
VxMouseRead,
VxMouseFini
};

View File

@ -0,0 +1,65 @@
/*
* $Id$
*
* Copyright © 1999 Network Computing Devices, Inc. All rights reserved.
*
* Author: Keith Packard
*/
#include "kdrive.h"
#include <X11/keysym.h>
int
VxWorksInit (void)
{
return 1;
}
void
VxWorksEnable (void)
{
}
Bool
VxWorksSpecialKey (KeySym sym)
{
switch (sym) {
case XK_Sys_Req:
download(1, "setup", 0);
return TRUE;
case XK_Break:
download(1, "launcher", 0);
return TRUE;
case XK_Delete:
dispatchException |= DE_REBOOT;
return TRUE;
case XK_BackSpace:
dispatchException |= DE_RESET;
return TRUE;
}
return FALSE;
}
void
VxWorksDisable (void)
{
}
void
VxWorksFini (void)
{
}
KdOsFuncs VxWorksFuncs = {
VxWorksInit,
VxWorksEnable,
VxWorksSpecialKey,
VxWorksDisable,
VxWorksFini,
};
void
OsVendorInit (void)
{
KdOsInit (&VxWorksFuncs);
}