Add modes, cursors and acceleration
This commit is contained in:
parent
240aeb4cda
commit
a6d519e527
|
@ -1,9 +1,9 @@
|
|||
XCOMM $XFree86$
|
||||
XCOMM $XFree86: xc/programs/Xserver/hw/kdrive/igs/Imakefile,v 1.1 2000/05/06 22:17:42 keithp Exp $
|
||||
#include <Server.tmpl>
|
||||
|
||||
SRCS = igs.c igsdraw.c igsstub.c
|
||||
SRCS = igs.c igscmap.c igscurs.c igsdraw.c igsreg.c igsstub.c
|
||||
|
||||
OBJS = igs.o igsdraw.o igsstub.o
|
||||
OBJS = igs.o igscmap.o igscurs.o igsdraw.o igsreg.o igsstub.o
|
||||
|
||||
INCLUDES = -I.. -I. -I$(XBUILDINCDIR) -I$(FONTINCSRC) \
|
||||
-I../../../fb -I../../../mi -I../../../include -I../../../os \
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* $XFree86$
|
||||
* $XFree86: xc/programs/Xserver/hw/kdrive/igs/igs.c,v 1.1 2000/05/06 22:17:43 keithp Exp $
|
||||
*
|
||||
* Copyright © 1999 SuSE, Inc.
|
||||
*
|
||||
|
@ -38,9 +38,14 @@ igsCardInit (KdCardInfo *card)
|
|||
|
||||
memset (igsc, '\0', sizeof (IgsCardInfo));
|
||||
|
||||
igsc->frameBuffer = (CARD8 *) KdMapDevice (card->attr.address[0],
|
||||
4096 * 1024);
|
||||
igsc->frameBuffer = (CARD8 *) KdMapDevice (card->attr.address[0] +
|
||||
IGS_FB,
|
||||
IGS_MEM);
|
||||
|
||||
igsc->vga = (VOL8 *) KdMapDevice (card->attr.address[0] +
|
||||
IGS_VGA,
|
||||
64 * 1024);
|
||||
|
||||
igsc->cop = (Cop5xxx *) KdMapDevice (card->attr.address[0] +
|
||||
IGS_COP_OFFSET,
|
||||
sizeof (Cop5xxx));
|
||||
|
@ -49,17 +54,36 @@ igsCardInit (KdCardInfo *card)
|
|||
IGS_COP_DATA,
|
||||
IGS_COP_DATA_LEN);
|
||||
|
||||
igsRegInit (&igsc->igsvga, igsc->vga);
|
||||
|
||||
card->driver = igsc;
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
Bool
|
||||
igsScreenInit (KdScreenInfo *screen)
|
||||
igsModeSupported (KdScreenInfo *screen,
|
||||
const KdMonitorTiming *t)
|
||||
{
|
||||
IgsCardInfo *igsc = screen->card->driver;
|
||||
int fb = 0;
|
||||
/* make sure the clock isn't too fast */
|
||||
if (t->clock > IGS_MAX_CLOCK)
|
||||
return FALSE;
|
||||
/* width must be a multiple of 16 */
|
||||
if (t->horizontal & 0xf)
|
||||
return FALSE;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
Bool
|
||||
igsModeUsable (KdScreenInfo *screen)
|
||||
{
|
||||
KdCardInfo *card = screen->card;
|
||||
int screen_size;
|
||||
int pixel_width;
|
||||
int byte_width;
|
||||
int fb = 0;
|
||||
|
||||
screen_size = 0;
|
||||
if (screen->fb[fb].depth >= 24)
|
||||
{
|
||||
screen->fb[fb].depth = 24;
|
||||
|
@ -76,11 +100,106 @@ igsScreenInit (KdScreenInfo *screen)
|
|||
screen->fb[fb].depth = 15;
|
||||
screen->fb[fb].bitsPerPixel = 16;
|
||||
}
|
||||
else if (screen->fb[fb].depth >= 12)
|
||||
{
|
||||
screen->fb[fb].depth = 12;
|
||||
screen->fb[fb].bitsPerPixel = 16;
|
||||
}
|
||||
else
|
||||
{
|
||||
screen->fb[fb].depth = 8;
|
||||
screen->fb[fb].bitsPerPixel = 8;
|
||||
}
|
||||
|
||||
byte_width = screen->width * (screen->fb[fb].bitsPerPixel >> 3);
|
||||
pixel_width = screen->width;
|
||||
screen->fb[fb].pixelStride = pixel_width;
|
||||
screen->fb[fb].byteStride = byte_width;
|
||||
screen_size += byte_width * screen->height;
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
Bool
|
||||
igsScreenInit (KdScreenInfo *screen)
|
||||
{
|
||||
IgsCardInfo *igsc = screen->card->driver;
|
||||
int fb = 0;
|
||||
IgsScreenInfo *igss;
|
||||
int screen_size, memory;
|
||||
int pattern_size;
|
||||
int tile_size;
|
||||
int stipple_size;
|
||||
int poffset, boffset;
|
||||
const KdMonitorTiming *t;
|
||||
|
||||
if (!screen->width || !screen->height)
|
||||
{
|
||||
screen->width = 800;
|
||||
screen->height = 600;
|
||||
screen->rate = 72;
|
||||
}
|
||||
if (!screen->fb[0].depth)
|
||||
screen->fb[0].depth = 8;
|
||||
|
||||
t = KdFindMode (screen, igsModeSupported);
|
||||
|
||||
screen->rate = t->rate;
|
||||
screen->width = t->horizontal;
|
||||
screen->height = t->vertical;
|
||||
|
||||
if (!KdTuneMode (screen, igsModeUsable, igsModeSupported))
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
igss = (IgsScreenInfo *) xalloc (sizeof (IgsScreenInfo));
|
||||
if (!igss)
|
||||
return FALSE;
|
||||
|
||||
memset (igss, '\0', sizeof (IgsScreenInfo));
|
||||
|
||||
screen_size = screen->fb[fb].byteStride * screen->height;
|
||||
memory = IGS_MEM;
|
||||
memory -= screen_size;
|
||||
if (memory >= 1024)
|
||||
{
|
||||
igss->cursor_offset = memory - 1024;
|
||||
#if BITMAP_BIT_ORDER == MSBFirst
|
||||
igss->cursor_base = (CARD8 *) KdMapDevice (card->attr.address[0] +
|
||||
igss->cursor_offset,
|
||||
1024);
|
||||
#else
|
||||
igss->cursor_base = igsc->frameBuffer + igss->cursor_offset;
|
||||
#endif
|
||||
memory -= 1024;
|
||||
}
|
||||
else
|
||||
igss->cursor_base = 0;
|
||||
|
||||
tile_size = IgsTileSize(screen->fb[fb].bitsPerPixel) * IGS_NUM_PATTERN;
|
||||
stipple_size = IgsStippleSize(screen->fb[fb].bitsPerPixel) * IGS_NUM_PATTERN;
|
||||
pattern_size = tile_size + stipple_size;
|
||||
if (memory >= pattern_size)
|
||||
{
|
||||
boffset = screen_size;
|
||||
poffset = boffset * 8 / screen->fb[fb].bitsPerPixel;
|
||||
igss->tile.offset = poffset;
|
||||
igss->tile.base = igsc->frameBuffer + boffset;
|
||||
|
||||
boffset = screen_size + tile_size;
|
||||
poffset = boffset * 8 / screen->fb[fb].bitsPerPixel;
|
||||
igss->stipple.offset = poffset;
|
||||
igss->stipple.base = igsc->frameBuffer + boffset;
|
||||
|
||||
memory -= pattern_size;
|
||||
}
|
||||
else
|
||||
{
|
||||
igss->tile.base = 0;
|
||||
igss->stipple.base = 0;
|
||||
}
|
||||
|
||||
switch (screen->fb[fb].depth) {
|
||||
case 8:
|
||||
screen->fb[fb].visuals = ((1 << StaticGray) |
|
||||
|
@ -112,11 +231,13 @@ igsScreenInit (KdScreenInfo *screen)
|
|||
screen->fb[fb].redMask = 0xff0000;
|
||||
break;
|
||||
}
|
||||
|
||||
screen->fb[fb].pixelStride = screen->width;
|
||||
screen->fb[fb].byteStride = screen->width * (screen->fb[fb].bitsPerPixel >> 3);
|
||||
screen->fb[fb].frameBuffer = igsc->frameBuffer;
|
||||
if (!igsc->cop)
|
||||
screen->dumb = TRUE;
|
||||
screen->driver = igss;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
@ -129,16 +250,345 @@ igsInitScreen(ScreenPtr pScreen)
|
|||
void
|
||||
igsPreserve (KdCardInfo *card)
|
||||
{
|
||||
IgsCardInfo *igsc = card->driver;
|
||||
IgsVga *igsvga = &igsc->igsvga;
|
||||
|
||||
igsSave (igsvga);
|
||||
}
|
||||
|
||||
void
|
||||
igsSetBlank (IgsVga *igsvga, Bool blank)
|
||||
{
|
||||
igsSetImm(igsvga, igs_screen_off, blank ? 1 : 0);
|
||||
}
|
||||
|
||||
void
|
||||
igsSetSync (IgsCardInfo *igsc, int hsync, int vsync)
|
||||
{
|
||||
IgsVga *igsvga = &igsc->igsvga;
|
||||
|
||||
igsSet (igsvga, igs_mexhsyn, hsync);
|
||||
igsSet (igsvga, igs_mexvsyn, vsync);
|
||||
VgaFlush (&igsvga->card);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Clock synthesis:
|
||||
*
|
||||
* scale = p ? (2 * p) : 1
|
||||
* f_out = f_ref * ((M + 1) / ((N + 1) * scale))
|
||||
*
|
||||
* Constraints:
|
||||
*
|
||||
* 1. 115MHz <= f_ref * ((M + 1) / (N + 1)) <= 260 MHz
|
||||
* 2. N >= 1
|
||||
*
|
||||
* Vertical refresh rate = clock / ((hsize + hblank) * (vsize + vblank))
|
||||
* Horizontal refresh rate = clock / (hsize + hblank)
|
||||
*/
|
||||
|
||||
/* all in kHz */
|
||||
|
||||
void
|
||||
igsGetClock (int target, int *Mp, int *Np, int *Pp, int maxM, int maxN, int maxP, int minVco)
|
||||
{
|
||||
int M, N, P, bestM, bestN;
|
||||
int f_vco, f_out;
|
||||
int err, abserr, besterr;
|
||||
|
||||
/*
|
||||
* Compute correct P value to keep VCO in range
|
||||
*/
|
||||
for (P = 0; P <= maxP; P++)
|
||||
{
|
||||
f_vco = target * IGS_SCALE(P);
|
||||
if (f_vco >= minVco)
|
||||
break;
|
||||
}
|
||||
|
||||
/* M = f_out / f_ref * ((N + 1) * IGS_SCALE(P)); */
|
||||
besterr = target;
|
||||
for (N = 1; N <= maxN; N++)
|
||||
{
|
||||
M = ((target * (N + 1) * IGS_SCALE(P) + (IGS_CLOCK_REF/2)) + IGS_CLOCK_REF/2) / IGS_CLOCK_REF - 1;
|
||||
if (0 <= M && M <= maxM)
|
||||
{
|
||||
f_out = IGS_CLOCK(M,N,P);
|
||||
err = target - f_out;
|
||||
if (err < 0)
|
||||
err = -err;
|
||||
if (err < besterr)
|
||||
{
|
||||
besterr = err;
|
||||
bestM = M;
|
||||
bestN = N;
|
||||
}
|
||||
}
|
||||
}
|
||||
*Mp = bestM;
|
||||
*Np = bestN;
|
||||
*Pp = P;
|
||||
}
|
||||
|
||||
void
|
||||
igsEnable (ScreenPtr pScreen)
|
||||
{
|
||||
KdScreenPriv(pScreen);
|
||||
KdCardInfo *card = pScreenPriv->card;
|
||||
KdScreenInfo *screen = pScreenPriv->screen;
|
||||
IgsCardInfo *igsc = card->driver;
|
||||
IgsVga *igsvga = &igsc->igsvga;
|
||||
const KdMonitorTiming *t;
|
||||
int hactive, hblank, hfp, hbp;
|
||||
int vactive, vblank, vfp, vbp;
|
||||
int hsize;
|
||||
int fb = 0;
|
||||
int m, n, r;
|
||||
int h_total;
|
||||
int h_display_end;
|
||||
int h_blank_start;
|
||||
int h_blank_end;
|
||||
int h_sync_start;
|
||||
int h_sync_end;
|
||||
int h_screen_off;
|
||||
int v_total;
|
||||
int v_retrace_start;
|
||||
int v_retrace_end;
|
||||
int v_display_end;
|
||||
int v_blank_start;
|
||||
int v_blank_end;
|
||||
int offset;
|
||||
int num_fetch;
|
||||
int m_m, m_n, m_r;
|
||||
|
||||
|
||||
igsSetBlank (igsvga, TRUE);
|
||||
|
||||
t = KdFindMode (screen, igsModeSupported);
|
||||
|
||||
igsGetClock (t->clock, &m, &n, &r, 2047, 255, 7, IGS_MIN_VCO);
|
||||
|
||||
/*
|
||||
* Set the chip so that 0x400000 is a big-endian frame buffer
|
||||
* with the correct byte swapping enabled
|
||||
*/
|
||||
igsSet (igsvga, igs_biga22force, 0);
|
||||
igsSet (igsvga, igs_biga22en, 1);
|
||||
igsSet (igsvga, igs_biga24en, 1);
|
||||
/*
|
||||
* Enable 8-bit DACs
|
||||
*/
|
||||
igsSet (igsvga, igs_rampwdn, 0);
|
||||
igsSet (igsvga, igs_dac6_8, 1);
|
||||
igsSet (igsvga, igs_dacpwdn, 0);
|
||||
/*
|
||||
* Set overscan to black
|
||||
*/
|
||||
igsSet (igsvga, igs_overscan_red, 0x00);
|
||||
igsSet (igsvga, igs_overscan_green, 0x00);
|
||||
igsSet (igsvga, igs_overscan_blue, 0x00);
|
||||
/*
|
||||
* Enable PCI retries
|
||||
*/
|
||||
igsSet (igsvga, igs_iow_retry, 1);
|
||||
igsSet (igsvga, igs_mw_retry, 1);
|
||||
igsSet (igsvga, igs_mr_retry, 1);
|
||||
igsSet (igsvga, igs_pci_burst_write, 1);
|
||||
igsSet (igsvga, igs_pci_burst_read, 1);
|
||||
/*
|
||||
* Set FIFO
|
||||
*/
|
||||
igsSet (igsvga, igs_memgopg, 1);
|
||||
igsSet (igsvga, igs_memr2wpg, 0);
|
||||
igsSet (igsvga, igs_crtff16, 0);
|
||||
igsSet (igsvga, igs_fifomust, 0xff);
|
||||
igsSet (igsvga, igs_fifogen, 0xff);
|
||||
/*
|
||||
* Enable CRT reg access
|
||||
*/
|
||||
igsSetImm (igsvga, igs_ena_vr_access, 1);
|
||||
igsSetImm (igsvga, igs_crt_protect, 0);
|
||||
|
||||
hfp = t->hfp;
|
||||
hbp = t->hbp;
|
||||
hblank = t->hblank;
|
||||
hactive = t->horizontal;
|
||||
offset = screen->fb[0].byteStride;
|
||||
|
||||
vfp = t->vfp;
|
||||
vbp = t->vbp;
|
||||
vblank = t->vblank;
|
||||
vactive = t->vertical;
|
||||
|
||||
/*
|
||||
* Compute character lengths for horizontal timing values
|
||||
*/
|
||||
hactive = screen->width / 8;
|
||||
hblank /= 8;
|
||||
hfp /= 8;
|
||||
hbp /= 8;
|
||||
offset /= 8;
|
||||
|
||||
switch (screen->fb[fb].bitsPerPixel) {
|
||||
case 8:
|
||||
igsSet (igsvga, igs_overscan_red, pScreen->blackPixel);
|
||||
igsSet (igsvga, igs_overscan_green, pScreen->blackPixel);
|
||||
igsSet (igsvga, igs_overscan_blue, pScreen->blackPixel);
|
||||
igsSet (igsvga, igs_bigswap, IGS_BIGSWAP_8);
|
||||
igsSet (igsvga, igs_mode_sel, IGS_MODE_8);
|
||||
igsSet (igsvga, igs_ramdacbypass, 0);
|
||||
break;
|
||||
case 16:
|
||||
igsSet (igsvga, igs_bigswap, IGS_BIGSWAP_16);
|
||||
igsSet (igsvga, igs_ramdacbypass, 1);
|
||||
switch (screen->fb[fb].depth) {
|
||||
case 12:
|
||||
igsSet (igsvga, igs_mode_sel, IGS_MODE_4444);
|
||||
break;
|
||||
case 15:
|
||||
igsSet (igsvga, igs_mode_sel, IGS_MODE_5551);
|
||||
break;
|
||||
case 16:
|
||||
igsSet (igsvga, igs_mode_sel, IGS_MODE_565);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case 24:
|
||||
igsSet (igsvga, igs_ramdacbypass, 1);
|
||||
igsSet (igsvga, igs_bigswap, IGS_BIGSWAP_8);
|
||||
igsSet (igsvga, igs_mode_sel, IGS_MODE_888);
|
||||
break;
|
||||
case 32:
|
||||
igsSet (igsvga, igs_ramdacbypass, 1);
|
||||
igsSet (igsvga, igs_bigswap, IGS_BIGSWAP_32);
|
||||
igsSet (igsvga, igs_mode_sel, IGS_MODE_8888);
|
||||
break;
|
||||
}
|
||||
|
||||
/*
|
||||
* Compute horizontal register values from timings
|
||||
*/
|
||||
h_total = hactive + hblank - 5;
|
||||
h_display_end = hactive - 1;
|
||||
|
||||
h_sync_start = hactive + hfp;
|
||||
h_sync_end = hactive + hblank - hbp;
|
||||
/*
|
||||
* pad the blank values narrow a bit and use the border_select to
|
||||
* eliminate the remaining border; don't know why, but it doesn't
|
||||
* work in the documented fashion
|
||||
*/
|
||||
h_blank_start = hactive - 1;
|
||||
h_blank_end = hactive + hblank - 1 - 1;
|
||||
|
||||
num_fetch = (t->horizontal * screen->fb[fb].bitsPerPixel / 64) + 1;
|
||||
|
||||
v_total = vactive + vblank - 2;
|
||||
v_display_end = vactive - 1;
|
||||
|
||||
v_blank_start = vactive - 1;
|
||||
v_blank_end = v_blank_start + vblank - 1;
|
||||
|
||||
v_retrace_start = vactive + vfp;
|
||||
v_retrace_end = vactive + vblank - vbp;
|
||||
|
||||
#if 0
|
||||
#define chk(a,b,c) fprintf (stderr, "%20.20s: BIOS %6d X %6d\n", a, igsGet(igsvga, b), c);
|
||||
|
||||
chk("h_total", igs_h_total, h_total);
|
||||
chk("h_display_end", igs_h_de_end, h_display_end);
|
||||
chk("h_sync_start", igs_h_rstart, h_sync_start);
|
||||
chk("h_sync_end", igs_h_rend, h_sync_end&0x1f);
|
||||
chk("h_blank_start", igs_h_bstart, h_blank_start);
|
||||
chk("h_blank_end", igs_h_bend, h_blank_end&0x3f);
|
||||
chk("offset", igs_offset, offset);
|
||||
chk("num_fetch", igs_num_fetch, num_fetch);
|
||||
|
||||
chk("v_total", igs_v_total, v_total);
|
||||
chk("v_display_end", igs_v_de_end, v_display_end);
|
||||
chk("v_blank_start", igs_v_bstart, v_blank_start);
|
||||
chk("v_blank_end", igs_v_bend, v_blank_end&0xf);
|
||||
chk("v_retrace_start", igs_v_rstart, v_retrace_start);
|
||||
chk("v_retrace_end", igs_v_rend, v_retrace_end&0xf);
|
||||
chk("vclk_m", igs_vclk_m, m);
|
||||
chk("vclk_n", igs_vclk_n, n);
|
||||
chk("vclk_p", igs_vclk_p, r);
|
||||
|
||||
fprintf (stderr, "%20.20s: BIOS %6d X %6d\n", "vclk",
|
||||
IGS_CLOCK(igsGet(igsvga,igs_vclk_m),
|
||||
igsGet(igsvga,igs_vclk_n),
|
||||
igsGet(igsvga,igs_vclk_p)),
|
||||
IGS_CLOCK(m,n,r));
|
||||
#endif
|
||||
igsSet (igsvga, igs_h_total, h_total);
|
||||
igsSet (igsvga, igs_h_de_end, h_display_end);
|
||||
igsSet (igsvga, igs_h_rstart, h_sync_start);
|
||||
igsSet (igsvga, igs_h_rend, h_sync_end);
|
||||
igsSet (igsvga, igs_h_bstart, h_blank_start);
|
||||
igsSet (igsvga, igs_h_bend, h_blank_end);
|
||||
igsSet (igsvga, igs_offset, offset);
|
||||
igsSet (igsvga, igs_num_fetch, num_fetch);
|
||||
|
||||
igsSet (igsvga, igs_v_total, v_total);
|
||||
igsSet (igsvga, igs_v_de_end, v_display_end);
|
||||
igsSet (igsvga, igs_v_bstart, v_blank_start);
|
||||
igsSet (igsvga, igs_v_bend, v_blank_end&0xf);
|
||||
igsSet (igsvga, igs_v_rstart, v_retrace_start);
|
||||
igsSet (igsvga, igs_v_rend, v_retrace_end&0xf);
|
||||
|
||||
igsSet (igsvga, igs_vclk_m, m);
|
||||
igsSet (igsvga, igs_vclk_n, n);
|
||||
igsSet (igsvga, igs_vclk_p, r);
|
||||
igsSet (igsvga, igs_vfsel, IGS_CLOCK(m, n, 0) >= 180000);
|
||||
VgaFlush (&igsvga->card);
|
||||
|
||||
igsSetImm (igsvga, igs_frqlat, 0);
|
||||
igsSetImm (igsvga, igs_frqlat, 1);
|
||||
igsSetImm (igsvga, igs_frqlat, 0);
|
||||
|
||||
igsSetBlank (igsvga, FALSE);
|
||||
#if 0
|
||||
#define dbg(a,b) fprintf(stderr, "%20.20s = 0x%x\n", a, igsGet(igsvga,b))
|
||||
|
||||
#include "reg.dbg"
|
||||
|
||||
{
|
||||
VGA16 reg;
|
||||
char buf[128];
|
||||
|
||||
for (reg = 0; reg < IGS_NREG; reg++)
|
||||
fprintf(stderr, "%20.20s = 0x%02x\n", igsRegName(buf, reg),
|
||||
VgaFetch (&igsvga->card, reg));
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
Bool
|
||||
igsDPMS (ScreenPtr pScreen, int mode)
|
||||
{
|
||||
KdScreenPriv(pScreen);
|
||||
IgsCardInfo *igsc = pScreenPriv->card->driver;
|
||||
IgsVga *igsvga = &igsc->igsvga;
|
||||
|
||||
switch (mode) {
|
||||
case KD_DPMS_NORMAL:
|
||||
igsSetSync (igsc, 0, 0);
|
||||
igsSetBlank (igsvga, FALSE);
|
||||
break;
|
||||
case KD_DPMS_STANDBY:
|
||||
igsSetBlank (igsvga, TRUE);
|
||||
igsSetSync (igsc, 1, 0);
|
||||
break;
|
||||
case KD_DPMS_SUSPEND:
|
||||
igsSetBlank (igsvga, TRUE);
|
||||
igsSetSync (igsc, 0, 1);
|
||||
break;
|
||||
case KD_DPMS_POWERDOWN:
|
||||
igsSetBlank (igsvga, TRUE);
|
||||
igsSetSync (igsc, 1, 1);
|
||||
break;
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
@ -150,11 +600,23 @@ igsDisable (ScreenPtr pScreen)
|
|||
void
|
||||
igsRestore (KdCardInfo *card)
|
||||
{
|
||||
IgsCardInfo *igsc = card->driver;
|
||||
IgsVga *igsvga = &igsc->igsvga;
|
||||
|
||||
igsReset (igsvga);
|
||||
}
|
||||
|
||||
void
|
||||
igsScreenFini (KdScreenInfo *screen)
|
||||
{
|
||||
IgsScreenInfo *igss = (IgsScreenInfo *) screen->driver;
|
||||
|
||||
#if BITMAP_BIT_ORDER == MSBFirst
|
||||
if (igss->cursor_base)
|
||||
KdUnmapDevice ((void *) igss->cursor_base, 1024);
|
||||
#endif
|
||||
xfree (igss);
|
||||
screen->driver = 0;
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -165,9 +627,11 @@ igsCardFini (KdCardInfo *card)
|
|||
if (igsc->copData)
|
||||
KdUnmapDevice ((void *) igsc->copData, IGS_COP_DATA_LEN);
|
||||
if (igsc->cop)
|
||||
KdUnmapDevice (igsc->cop, sizeof (Cop5xxx));
|
||||
KdUnmapDevice ((void *) igsc->cop, sizeof (Cop5xxx));
|
||||
if (igsc->vga)
|
||||
KdUnmapDevice ((void *) igsc->vga, 64 * 1024);
|
||||
if (igsc->frameBuffer)
|
||||
KdUnmapDevice (igsc->frameBuffer, 4096 * 1024);
|
||||
KdUnmapDevice (igsc->frameBuffer, IGS_MEM);
|
||||
xfree (igsc);
|
||||
card->driver = 0;
|
||||
}
|
||||
|
@ -184,10 +648,10 @@ KdCardFuncs igsFuncs = {
|
|||
igsScreenFini, /* scrfini */
|
||||
igsCardFini, /* cardfini */
|
||||
|
||||
0, /* initCursor */
|
||||
0, /* enableCursor */
|
||||
0, /* disableCursor */
|
||||
0, /* finiCursor */
|
||||
igsCursorInit, /* initCursor */
|
||||
igsCursorEnable, /* enableCursor */
|
||||
igsCursorDisable, /* disableCursor */
|
||||
igsCursorFini, /* finiCursor */
|
||||
0, /* recolorCursor */
|
||||
|
||||
igsDrawInit, /* initAccel */
|
||||
|
@ -196,6 +660,6 @@ KdCardFuncs igsFuncs = {
|
|||
igsDrawDisable, /* disableAccel */
|
||||
igsDrawFini, /* finiAccel */
|
||||
|
||||
0, /* getColors */
|
||||
0, /* putColors */
|
||||
igsGetColors, /* getColors */
|
||||
igsPutColors, /* putColors */
|
||||
};
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* $XFree86$
|
||||
* $XFree86: xc/programs/Xserver/hw/kdrive/igs/igs.h,v 1.1 2000/05/06 22:17:43 keithp Exp $
|
||||
*
|
||||
* Copyright © 1999 SuSE, Inc.
|
||||
*
|
||||
|
@ -27,6 +27,7 @@
|
|||
#define _IGS_H_
|
||||
|
||||
#include "kdrive.h"
|
||||
#include "igsreg.h"
|
||||
|
||||
extern KdCardFuncs igsFuncs;
|
||||
|
||||
|
@ -37,28 +38,50 @@ extern KdCardFuncs igsFuncs;
|
|||
* Coprocessor 0x008bf000
|
||||
*/
|
||||
|
||||
#if BITMAP_BIT_ORDER == MSBFirst
|
||||
#define IGS_FB 0x00400000
|
||||
#else
|
||||
#define IGS_FB 0x00000000
|
||||
#endif
|
||||
#define IGS_VGA 0x00800000
|
||||
#define IGS_COP_DATA 0x008a0000
|
||||
#define IGS_COP_DATA_LEN 0x00010000
|
||||
#define IGS_COP_OFFSET 0x008bf000
|
||||
/* give audio 1/2 meg at end */
|
||||
#if 1
|
||||
#define IGS_MEM ((4096-512)*1024)
|
||||
#else
|
||||
#define IGS_MEM ((4096)*1024)
|
||||
#endif
|
||||
|
||||
#define IGS_CLOCK_REF 24576 /* KHz */
|
||||
|
||||
#define IGS_SCALE(p) ((p) ? (2 * (p)) : 1)
|
||||
|
||||
#define IGS_CLOCK(m,n,p) ((IGS_CLOCK_REF * ((m) + 1)) / (((n) + 1) * IGS_SCALE(p)))
|
||||
|
||||
#define IGS_MAX_CLOCK 260000
|
||||
|
||||
#define IGS_MIN_VCO 115000
|
||||
|
||||
typedef volatile CARD8 VOL8;
|
||||
typedef volatile CARD16 VOL16;
|
||||
typedef volatile CARD32 VOL32;
|
||||
|
||||
typedef struct _Cop5xxx {
|
||||
VOL8 pad000[0x11]; /* 0x000 */
|
||||
VOL8 pad000[0x10]; /* 0x000 */
|
||||
|
||||
VOL8 control; /* 0x011 */
|
||||
#define IGS_CONTROL_HBLTW_RDYZ 0x01
|
||||
#define IGS_CONTROL_MALLWBEPTZ 0x02
|
||||
#define IGS_CONTROL_CMDFF 0x04
|
||||
#define IGS_CONTROL_SOP 0x08
|
||||
#define IGS_CONTROL_OPS 0x10
|
||||
#define IGS_CONTROL_TER 0x20
|
||||
#define IGS_CONTROL_HBACKZ 0x40
|
||||
#define IGS_CONTROL_BUSY 0x80
|
||||
VOL32 control; /* 0x010 */
|
||||
#define IGS_CONTROL_HBLTW_RDYZ 0x0100
|
||||
#define IGS_CONTROL_MALLWBEPTZ 0x0200
|
||||
#define IGS_CONTROL_CMDFF 0x0400
|
||||
#define IGS_CONTROL_SOP 0x0800
|
||||
#define IGS_CONTROL_OPS 0x1000
|
||||
#define IGS_CONTROL_TER 0x2000
|
||||
#define IGS_CONTROL_HBACKZ 0x4000
|
||||
#define IGS_CONTROL_BUSY 0x8000
|
||||
|
||||
VOL8 pad012[0x06]; /* 0x012 */
|
||||
VOL8 pad014[0x04]; /* 0x014 */
|
||||
|
||||
VOL32 src1_stride; /* 0x018 */
|
||||
|
||||
|
@ -110,8 +133,8 @@ typedef struct _Cop5xxx {
|
|||
VOL32 src1_base_address; /* 0x070 */
|
||||
VOL8 pad074[0x04]; /* 0x074 */
|
||||
|
||||
VOL16 dst_x_rotate; /* 0x078 */
|
||||
VOL16 pat_y_rotate; /* 0x07a */
|
||||
VOL32 rotate; /* 0x078 */
|
||||
#define IGS_MAKE_ROTATE(x,y) ((x) | ((y) << 16))
|
||||
VOL32 operation; /* 0x07c */
|
||||
|
||||
/* OCT[2:0] */
|
||||
|
@ -146,6 +169,7 @@ typedef struct _Cop5xxx {
|
|||
#define IGS_PIXEL_LINE_TRANS 0x00007000
|
||||
#define IGS_PIXEL_FG 0x00008000
|
||||
#define IGS_PIXEL_TILE 0x00009000
|
||||
#define IGS_PIXEL_TILE_OPAQUE 0x0000d000
|
||||
|
||||
/* HostBltEnable[1:0] */
|
||||
#define IGS_HBLT_DISABLE 0x00000000
|
||||
|
@ -173,11 +197,10 @@ typedef struct _Cop5xxx {
|
|||
/* BGS */
|
||||
#define IGS_BGS_BG 0x00000000
|
||||
#define IGS_BGS_SRC 0x80000000
|
||||
VOL8 pad080[0x91]; /* 0x080 */
|
||||
VOL8 pad080[0x90]; /* 0x080 */
|
||||
|
||||
VOL8 debug_control_1; /* 0x111 */
|
||||
VOL8 debug_control_2; /* 0x112 */
|
||||
VOL8 pad113[0x05]; /* 0x113 */
|
||||
VOL32 debug_control; /* 0x110 */
|
||||
VOL8 pad114[0x04]; /* 0x114 */
|
||||
|
||||
VOL32 src2_stride; /* 0x118 */
|
||||
VOL8 pad11c[0x14]; /* 0x11c */
|
||||
|
@ -194,37 +217,82 @@ typedef struct _Cop5xxx {
|
|||
#define IGS_WRMRSTZ 0x100
|
||||
#define IGS_TEST_MTST 0x200
|
||||
|
||||
VOL8 style_line_roll_over; /* 0x134 */
|
||||
VOL8 style_line_inc; /* 0x135 */
|
||||
VOL8 style_line_pattern; /* 0x136 */
|
||||
VOL8 style_line_accumulator; /* 0x137 */
|
||||
VOL8 style_line_pattern_index; /* 0x138 */
|
||||
VOL8 pad139[0x3]; /* 0x139 */
|
||||
VOL32 style_line; /* 0x134 */
|
||||
#define IGS_MAKE_STILE_LINE(roll_over,inc,pattern,accumulator) \
|
||||
((roll_over) | \
|
||||
((style_line_inc) << 8) | \
|
||||
((style_line_patern) << 16) | \
|
||||
((style_line_accumullator) << 24))
|
||||
VOL32 style_line_pattern_index; /* 0x138 */
|
||||
|
||||
VOL16 mono_burst_total; /* 0x13c */
|
||||
VOL8 pad13e[0x12]; /* 0x13e */
|
||||
VOL32 mono_burst_total; /* 0x13c */
|
||||
VOL8 pad140[0x10]; /* 0x140 */
|
||||
|
||||
VOL8 pat_x_rotate; /* 0x150 */
|
||||
VOL8 pad151[0x1f]; /* 0x151 */
|
||||
VOL32 pat_x_rotate; /* 0x150 */
|
||||
VOL8 pad154[0x1c]; /* 0x154 */
|
||||
|
||||
VOL32 src1_start; /* 0x170 */
|
||||
VOL32 src2_start; /* 0x174 */
|
||||
VOL32 dst_start; /* 0x178 */
|
||||
VOL8 pad17c[0x9c]; /* 0x17c */
|
||||
|
||||
VOL16 dst_stride; /* 0x218 */
|
||||
VOL32 dst_stride; /* 0x218 */
|
||||
} Cop5xxx;
|
||||
|
||||
typedef struct _igsCardInfo {
|
||||
Cop5xxx *cop;
|
||||
VOL8 *vga;
|
||||
VOL32 *copData;
|
||||
Bool need_sync;
|
||||
CARD8 *frameBuffer;
|
||||
IgsVga igsvga;
|
||||
} IgsCardInfo;
|
||||
|
||||
#define getIgsCardInfo(kd) ((IgsCardInfo *) ((kd)->card->driver))
|
||||
#define igsCardInfo(kd) IgsCardInfo *igsc = getIgsCardInfo(kd)
|
||||
|
||||
typedef struct _igsCursor {
|
||||
int width, height;
|
||||
int xhot, yhot;
|
||||
Bool has_cursor;
|
||||
CursorPtr pCursor;
|
||||
Pixel source, mask;
|
||||
} IgsCursor;
|
||||
|
||||
#define IGS_CURSOR_WIDTH 64
|
||||
#define IGS_CURSOR_HEIGHT 64
|
||||
|
||||
typedef struct _igsPattern {
|
||||
INT32 xrot, yrot;
|
||||
CARD32 serial_number;
|
||||
CARD8 *base;
|
||||
CARD32 offset;
|
||||
} IgsPattern;
|
||||
|
||||
#define IGS_NUM_PATTERN 8
|
||||
#define IGS_PATTERN_WIDTH 8
|
||||
#define IGS_PATTERN_HEIGHT 8
|
||||
|
||||
typedef struct _igsPatternCache {
|
||||
CARD8 *base;
|
||||
CARD32 offset;
|
||||
IgsPattern pattern[IGS_NUM_PATTERN];
|
||||
int next;
|
||||
} IgsPatternCache;
|
||||
|
||||
typedef struct _igsScreenInfo {
|
||||
CARD8 *cursor_base;
|
||||
CARD32 cursor_offset;
|
||||
IgsCursor cursor;
|
||||
IgsPatternCache tile;
|
||||
IgsPatternCache stipple;
|
||||
} IgsScreenInfo;
|
||||
|
||||
#define IgsTileSize(bpp) (IGS_PATTERN_WIDTH*(bpp)/8*IGS_PATTERN_HEIGHT)
|
||||
#define IgsStippleSize(bpp) (IGS_PATTERN_WIDTH/8*IGS_PATTERN_HEIGHT)
|
||||
|
||||
#define getIgsScreenInfo(kd) ((IgsScreenInfo *) ((kd)->screen->driver))
|
||||
#define igsScreenInfo(kd) IgsScreenInfo *igss = getIgsScreenInfo(kd)
|
||||
|
||||
Bool
|
||||
igsDrawInit (ScreenPtr pScreen);
|
||||
|
||||
|
@ -240,5 +308,22 @@ igsDrawSync (ScreenPtr pScreen);
|
|||
void
|
||||
igsDrawFini (ScreenPtr pScreen);
|
||||
|
||||
|
||||
void
|
||||
igsGetColors (ScreenPtr pScreen, int fb, int ndef, xColorItem *pdefs);
|
||||
|
||||
void
|
||||
igsPutColors (ScreenPtr pScreen, int fb, int ndef, xColorItem *pdefs);
|
||||
|
||||
Bool
|
||||
igsCursorInit (ScreenPtr pScreen);
|
||||
|
||||
void
|
||||
igsCursorEnable (ScreenPtr pScreen);
|
||||
|
||||
void
|
||||
igsCursorDisable (ScreenPtr pScreen);
|
||||
|
||||
void
|
||||
igsCursorFini (ScreenPtr pScreen);
|
||||
|
||||
#endif /* _IGS_H_ */
|
||||
|
|
|
@ -0,0 +1,61 @@
|
|||
/*
|
||||
* $XFree86$
|
||||
*
|
||||
* Copyright © 2000 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 "igs.h"
|
||||
|
||||
#define IGS_DAC_SHIFT 8
|
||||
void
|
||||
igsGetColors (ScreenPtr pScreen, int fb, int ndef, xColorItem *pdefs)
|
||||
{
|
||||
KdScreenPriv(pScreen);
|
||||
igsCardInfo(pScreenPriv);
|
||||
IgsVga *igsvga = &igsc->igsvga;
|
||||
|
||||
while (ndef--)
|
||||
{
|
||||
igsSetImm (igsvga, igs_dac_read_index, pdefs->pixel);
|
||||
pdefs->red = igsGetImm (igsvga, igs_dac_data) << IGS_DAC_SHIFT;
|
||||
pdefs->green = igsGetImm (igsvga, igs_dac_data) << IGS_DAC_SHIFT;
|
||||
pdefs->blue = igsGetImm (igsvga, igs_dac_data) << IGS_DAC_SHIFT;
|
||||
pdefs++;
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
igsPutColors (ScreenPtr pScreen, int fb, int ndef, xColorItem *pdefs)
|
||||
{
|
||||
KdScreenPriv(pScreen);
|
||||
igsCardInfo(pScreenPriv);
|
||||
IgsVga *igsvga = &igsc->igsvga;
|
||||
|
||||
while (ndef--)
|
||||
{
|
||||
igsSetImm (igsvga, igs_dac_write_index, pdefs->pixel);
|
||||
igsSetImm (igsvga, igs_dac_data, pdefs->red >> IGS_DAC_SHIFT);
|
||||
igsSetImm (igsvga, igs_dac_data, pdefs->green >> IGS_DAC_SHIFT);
|
||||
igsSetImm (igsvga, igs_dac_data, pdefs->blue >> IGS_DAC_SHIFT);
|
||||
pdefs++;
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,344 @@
|
|||
/*
|
||||
* $XFree86$
|
||||
*
|
||||
* Copyright © 2000 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 "igs.h"
|
||||
#include "cursorstr.h"
|
||||
|
||||
#define SetupCursor(s) KdScreenPriv(s); \
|
||||
igsCardInfo(pScreenPriv); \
|
||||
igsScreenInfo(pScreenPriv); \
|
||||
IgsCursor *pCurPriv = &igss->cursor; \
|
||||
IgsVga *igsvga = &igsc->igsvga
|
||||
|
||||
static void
|
||||
_igsMoveCursor (ScreenPtr pScreen, int x, int y)
|
||||
{
|
||||
SetupCursor(pScreen);
|
||||
CARD8 xoff, yoff;
|
||||
|
||||
x -= pCurPriv->xhot;
|
||||
xoff = 0;
|
||||
if (x < 0)
|
||||
{
|
||||
xoff = -x;
|
||||
x = 0;
|
||||
}
|
||||
y -= pCurPriv->yhot;
|
||||
yoff = 0;
|
||||
if (y < 0)
|
||||
{
|
||||
yoff = -y;
|
||||
y = 0;
|
||||
}
|
||||
|
||||
igsSet (igsvga, igs_sprite_x, x);
|
||||
igsSet (igsvga, igs_sprite_preset_x, xoff);
|
||||
igsSet (igsvga, igs_sprite_y, y);
|
||||
igsSet (igsvga, igs_sprite_preset_y, yoff);
|
||||
}
|
||||
|
||||
static void
|
||||
igsMoveCursor (ScreenPtr pScreen, int x, int y)
|
||||
{
|
||||
SetupCursor (pScreen);
|
||||
|
||||
if (!pCurPriv->has_cursor)
|
||||
return;
|
||||
|
||||
if (!pScreenPriv->enabled)
|
||||
return;
|
||||
|
||||
_igsMoveCursor (pScreen, x, y);
|
||||
VgaFlush (&igsvga->card);
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
igsSetCursorColors (ScreenPtr pScreen)
|
||||
{
|
||||
SetupCursor (pScreen);
|
||||
CursorPtr pCursor = pCurPriv->pCursor;
|
||||
|
||||
igsSetImm (igsvga, igs_cursor_write_index, 0);
|
||||
igsSetImm (igsvga, igs_cursor_data, pCursor->backRed >> 8);
|
||||
igsSetImm (igsvga, igs_cursor_data, pCursor->backGreen >> 8);
|
||||
igsSetImm (igsvga, igs_cursor_data, pCursor->backBlue >> 8);
|
||||
igsSetImm (igsvga, igs_cursor_write_index, 1);
|
||||
igsSetImm (igsvga, igs_cursor_data, pCursor->foreRed >> 8);
|
||||
igsSetImm (igsvga, igs_cursor_data, pCursor->foreGreen >> 8);
|
||||
igsSetImm (igsvga, igs_cursor_data, pCursor->foreBlue >> 8);
|
||||
}
|
||||
|
||||
#if BITMAP_BIT_ORDER == MSBFirst
|
||||
#define IgsAdjustCursor(v) { \
|
||||
v = ((v & 0x55555555) << 1) | ((v >> 1) & 0x55555555); \
|
||||
v = ((v & 0x33333333) << 2) | ((v >> 2) & 0x33333333); \
|
||||
v = ((v & 0x0f0f0f0f) << 4) | ((v >> 4) & 0x0f0f0f0f); \
|
||||
v = ((v & 0x00ff00ff) << 8) | ((v >> 8) & 0x00ff00ff); \
|
||||
v = ((v & 0x0000ffff) <<16) | ((v >>16) & 0x0000ffff); \
|
||||
}
|
||||
#else
|
||||
#define IgsAdjustCursor(v)
|
||||
#endif
|
||||
|
||||
#define ExplodeBits2(v) (((v) & 1) | (((v) & 2) << 1))
|
||||
#define ExplodeBits4(v) ((ExplodeBits2((v) >> 2) << 4) | \
|
||||
(ExplodeBits2((v) & 0x3)))
|
||||
#define ExplodeBits8(v) ((ExplodeBits4((v) >> 4) << 8) | \
|
||||
(ExplodeBits4((v) & 0xf)))
|
||||
#define ExplodeBits16(v) ((ExplodeBits8((v) >> 8) << 16) | \
|
||||
(ExplodeBits8((v) & 0xff)))
|
||||
static void
|
||||
igsLoadCursor (ScreenPtr pScreen, int x, int y)
|
||||
{
|
||||
SetupCursor(pScreen);
|
||||
CursorPtr pCursor = pCurPriv->pCursor;
|
||||
CursorBitsPtr bits = pCursor->bits;
|
||||
int w, h;
|
||||
CARD32 *ram, *msk, *mskLine, *src, *srcLine;
|
||||
int i, j;
|
||||
int cursor_address;
|
||||
int lwsrc;
|
||||
unsigned char ramdac_control_;
|
||||
CARD32 offset;
|
||||
CARD32 b0, b1;
|
||||
|
||||
pCurPriv->pCursor = pCursor;
|
||||
pCurPriv->xhot = pCursor->bits->xhot;
|
||||
pCurPriv->yhot = pCursor->bits->yhot;
|
||||
|
||||
/*
|
||||
* Stick new image into cursor memory
|
||||
*/
|
||||
ram = (CARD32 *) igss->cursor_base;
|
||||
mskLine = (CARD32 *) bits->mask;
|
||||
srcLine = (CARD32 *) bits->source;
|
||||
|
||||
h = bits->height;
|
||||
if (h > IGS_CURSOR_HEIGHT)
|
||||
h = IGS_CURSOR_HEIGHT;
|
||||
|
||||
lwsrc = BitmapBytePad(bits->width) / 4; /* words per line */
|
||||
|
||||
for (i = 0; i < IGS_CURSOR_HEIGHT; i++) {
|
||||
msk = mskLine;
|
||||
src = srcLine;
|
||||
mskLine += lwsrc;
|
||||
srcLine += lwsrc;
|
||||
for (j = 0; j < IGS_CURSOR_WIDTH / 32; j++) {
|
||||
|
||||
CARD32 m, s;
|
||||
|
||||
if (i < h && j < lwsrc)
|
||||
{
|
||||
m = *msk++;
|
||||
s = *src++;
|
||||
IgsAdjustCursor(m);
|
||||
IgsAdjustCursor(s);
|
||||
}
|
||||
else
|
||||
{
|
||||
m = 0;
|
||||
s = 0;
|
||||
}
|
||||
s &= m;
|
||||
m = ~m;
|
||||
b0 = ExplodeBits16(s&0xffff) | (ExplodeBits16(m&0xffff)<<1);
|
||||
b1 = ExplodeBits16(s>>16) | (ExplodeBits16(m>>16)<<1);
|
||||
*ram++ = b0;
|
||||
*ram++ = b1;
|
||||
}
|
||||
}
|
||||
|
||||
/* Set new color */
|
||||
igsSetCursorColors (pScreen);
|
||||
|
||||
/* Set address for cursor bits */
|
||||
offset = igss->cursor_offset;
|
||||
offset >>= 10;
|
||||
igsSet (igsvga, igs_sprite_addr, offset);
|
||||
|
||||
/* Assume TV interpolation off */
|
||||
igsSet (igsvga, igs_hcshf, 3);
|
||||
/* Enable the cursor */
|
||||
igsSet (igsvga, igs_sprite_visible, 1);
|
||||
igsSet (igsvga, igs_sprite_64x64, 1);
|
||||
/* Move to new position */
|
||||
_igsMoveCursor (pScreen, x, y);
|
||||
|
||||
VgaFlush (&igsvga->card);
|
||||
}
|
||||
|
||||
static void
|
||||
igsUnloadCursor (ScreenPtr pScreen)
|
||||
{
|
||||
SetupCursor (pScreen);
|
||||
|
||||
/* Disable cursor */
|
||||
igsSet (igsvga, igs_sprite_visible, 0);
|
||||
VgaFlush (&igsvga->card);
|
||||
}
|
||||
|
||||
static Bool
|
||||
igsRealizeCursor (ScreenPtr pScreen, CursorPtr pCursor)
|
||||
{
|
||||
SetupCursor(pScreen);
|
||||
|
||||
if (!pScreenPriv->enabled)
|
||||
return TRUE;
|
||||
|
||||
/* miRecolorCursor does this */
|
||||
if (pCurPriv->pCursor == pCursor)
|
||||
{
|
||||
if (pCursor)
|
||||
{
|
||||
int x, y;
|
||||
|
||||
miPointerPosition (&x, &y);
|
||||
igsLoadCursor (pScreen, x, y);
|
||||
}
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static Bool
|
||||
igsUnrealizeCursor (ScreenPtr pScreen, CursorPtr pCursor)
|
||||
{
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static void
|
||||
igsSetCursor (ScreenPtr pScreen, CursorPtr pCursor, int x, int y)
|
||||
{
|
||||
SetupCursor(pScreen);
|
||||
|
||||
pCurPriv->pCursor = pCursor;
|
||||
|
||||
if (!pScreenPriv->enabled)
|
||||
return;
|
||||
|
||||
if (pCursor)
|
||||
igsLoadCursor (pScreen, x, y);
|
||||
else
|
||||
igsUnloadCursor (pScreen);
|
||||
}
|
||||
|
||||
miPointerSpriteFuncRec igsPointerSpriteFuncs = {
|
||||
igsRealizeCursor,
|
||||
igsUnrealizeCursor,
|
||||
igsSetCursor,
|
||||
igsMoveCursor,
|
||||
};
|
||||
|
||||
static void
|
||||
igsQueryBestSize (int class,
|
||||
unsigned short *pwidth, unsigned short *pheight,
|
||||
ScreenPtr pScreen)
|
||||
{
|
||||
SetupCursor (pScreen);
|
||||
|
||||
switch (class)
|
||||
{
|
||||
case CursorShape:
|
||||
if (*pwidth > pCurPriv->width)
|
||||
*pwidth = pCurPriv->width;
|
||||
if (*pheight > pCurPriv->height)
|
||||
*pheight = pCurPriv->height;
|
||||
if (*pwidth > pScreen->width)
|
||||
*pwidth = pScreen->width;
|
||||
if (*pheight > pScreen->height)
|
||||
*pheight = pScreen->height;
|
||||
break;
|
||||
default:
|
||||
fbQueryBestSize (class, pwidth, pheight, pScreen);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
Bool
|
||||
igsCursorInit (ScreenPtr pScreen)
|
||||
{
|
||||
SetupCursor (pScreen);
|
||||
|
||||
if (!igss->cursor_base)
|
||||
{
|
||||
pCurPriv->has_cursor = FALSE;
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
pCurPriv->width = IGS_CURSOR_WIDTH;
|
||||
pCurPriv->height= IGS_CURSOR_HEIGHT;
|
||||
pScreen->QueryBestSize = igsQueryBestSize;
|
||||
miPointerInitialize (pScreen,
|
||||
&igsPointerSpriteFuncs,
|
||||
&kdPointerScreenFuncs,
|
||||
FALSE);
|
||||
pCurPriv->has_cursor = TRUE;
|
||||
pCurPriv->pCursor = NULL;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
void
|
||||
igsCursorEnable (ScreenPtr pScreen)
|
||||
{
|
||||
SetupCursor (pScreen);
|
||||
|
||||
if (pCurPriv->has_cursor)
|
||||
{
|
||||
if (pCurPriv->pCursor)
|
||||
{
|
||||
int x, y;
|
||||
|
||||
miPointerPosition (&x, &y);
|
||||
igsLoadCursor (pScreen, x, y);
|
||||
}
|
||||
else
|
||||
igsUnloadCursor (pScreen);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
igsCursorDisable (ScreenPtr pScreen)
|
||||
{
|
||||
SetupCursor (pScreen);
|
||||
|
||||
if (!pScreenPriv->enabled)
|
||||
return;
|
||||
|
||||
if (pCurPriv->has_cursor)
|
||||
{
|
||||
if (pCurPriv->pCursor)
|
||||
{
|
||||
igsUnloadCursor (pScreen);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
igsCursorFini (ScreenPtr pScreen)
|
||||
{
|
||||
SetupCursor (pScreen);
|
||||
|
||||
pCurPriv->pCursor = NULL;
|
||||
}
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* $XFree86$
|
||||
* $XFree86: xc/programs/Xserver/hw/kdrive/igs/igsdraw.c,v 1.1 2000/05/06 22:17:43 keithp Exp $
|
||||
*
|
||||
* Copyright © 2000 Keith Packard
|
||||
*
|
||||
|
@ -72,6 +72,105 @@ CARD8 igsPatRop[16] = {
|
|||
#define PixTransStore(t) *pix_trans = (t)
|
||||
#endif
|
||||
|
||||
static IgsPattern *
|
||||
igsSetPattern (ScreenPtr pScreen,
|
||||
PixmapPtr pPixmap,
|
||||
CARD8 fillStyle,
|
||||
INT32 xrot,
|
||||
INT32 yrot)
|
||||
{
|
||||
KdScreenPriv(pScreen);
|
||||
igsCardInfo(pScreenPriv);
|
||||
igsScreenInfo(pScreenPriv);
|
||||
int i;
|
||||
IgsPatternCache *c;
|
||||
IgsPattern *p;
|
||||
|
||||
if (fillStyle == FillTiled)
|
||||
c = &igss->tile;
|
||||
else
|
||||
c = &igss->stipple;
|
||||
for (i = 0; i < IGS_NUM_PATTERN; i++)
|
||||
{
|
||||
p = &c->pattern[i];
|
||||
if (p->serial_number == pPixmap->drawable.serialNumber &&
|
||||
p->xrot == xrot &&
|
||||
p->yrot == yrot)
|
||||
{
|
||||
return p;
|
||||
}
|
||||
}
|
||||
p = &c->pattern[c->next];
|
||||
if (++c->next == IGS_NUM_PATTERN)
|
||||
c->next = 0;
|
||||
p->serial_number = pPixmap->drawable.serialNumber;
|
||||
p->xrot = xrot;
|
||||
p->yrot = yrot;
|
||||
|
||||
if (fillStyle != FillTiled)
|
||||
{
|
||||
FbStip *pix;
|
||||
FbStride pixStride;
|
||||
int pixBpp;
|
||||
CARD8 tmp[8];
|
||||
CARD32 *pat;
|
||||
int stipX, stipY;
|
||||
int y;
|
||||
FbStip bits;
|
||||
|
||||
modulus (-yrot, pPixmap->drawable.height, stipY);
|
||||
modulus (-xrot, FB_UNIT, stipX);
|
||||
|
||||
pat = (CARD32 *) p->base;
|
||||
|
||||
fbGetStipDrawable (&pPixmap->drawable, pix, pixStride, pixBpp);
|
||||
|
||||
for (y = 0; y < 8; y++)
|
||||
{
|
||||
bits = pix[stipY * pixStride];
|
||||
FbRotLeft (bits, stipX);
|
||||
tmp[y] = (CARD8) bits;
|
||||
stipY++;
|
||||
if (stipY == pPixmap->drawable.height)
|
||||
stipY = 0;
|
||||
}
|
||||
for (i = 0; i < 2; i++)
|
||||
{
|
||||
bits = (tmp[i*4+0] |
|
||||
(tmp[i*4+1] << 8) |
|
||||
(tmp[i*4+2] << 16) |
|
||||
(tmp[i*4+3] << 24));
|
||||
IgsAdjustBits32 (bits);
|
||||
*pat++ = bits;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
FbBits *pix;
|
||||
FbStride pixStride;
|
||||
int pixBpp;
|
||||
FbBits *pat;
|
||||
FbStride patStride;
|
||||
int patBpp;
|
||||
|
||||
fbGetDrawable (&pPixmap->drawable, pix, pixStride, pixBpp);
|
||||
|
||||
pat = (FbBits *) p->base;
|
||||
patBpp = pixBpp;
|
||||
patStride = (patBpp * IGS_PATTERN_WIDTH) / (8 * sizeof (FbBits));
|
||||
|
||||
fbTile (pat, patStride, 0,
|
||||
patBpp * IGS_PATTERN_WIDTH, IGS_PATTERN_HEIGHT,
|
||||
|
||||
pix, pixStride,
|
||||
pPixmap->drawable.width * pixBpp,
|
||||
pPixmap->drawable.height,
|
||||
GXcopy, FB_ALLONES, pixBpp,
|
||||
xrot * pixBpp, yrot);
|
||||
}
|
||||
return p;
|
||||
}
|
||||
|
||||
void
|
||||
igsFillBoxSolid (DrawablePtr pDrawable, int nBox, BoxPtr pBox,
|
||||
unsigned long pixel, int alu, unsigned long planemask)
|
||||
|
@ -88,6 +187,122 @@ igsFillBoxSolid (DrawablePtr pDrawable, int nBox, BoxPtr pBox,
|
|||
KdMarkSync (pDrawable->pScreen);
|
||||
}
|
||||
|
||||
void
|
||||
igsFillBoxTiled (DrawablePtr pDrawable, int nBox, BoxPtr pBox,
|
||||
PixmapPtr pPixmap, int xrot, int yrot, int alu)
|
||||
{
|
||||
SetupIgs(pDrawable->pScreen);
|
||||
CARD32 cmd;
|
||||
IgsPattern *p = igsSetPattern (pDrawable->pScreen,
|
||||
pPixmap,
|
||||
FillTiled,
|
||||
xrot, yrot);
|
||||
|
||||
_igsSetTiledRect(cop,alu,planemask,p->offset,cmd);
|
||||
while (nBox--)
|
||||
{
|
||||
_igsPatRect(cop,pBox->x1,pBox->y1,pBox->x2-pBox->x1,pBox->y2-pBox->y1,cmd);
|
||||
pBox++;
|
||||
}
|
||||
KdMarkSync (pDrawable->pScreen);
|
||||
}
|
||||
|
||||
void
|
||||
igsFillBoxStippled (DrawablePtr pDrawable, GCPtr pGC,
|
||||
int nBox, BoxPtr pBox)
|
||||
{
|
||||
SetupIgs(pDrawable->pScreen);
|
||||
CARD32 cmd;
|
||||
int xrot = pGC->patOrg.x + pDrawable->x;
|
||||
int yrot = pGC->patOrg.y + pDrawable->y;
|
||||
IgsPattern *p = igsSetPattern (pDrawable->pScreen,
|
||||
pGC->stipple,
|
||||
pGC->fillStyle,
|
||||
xrot, yrot);
|
||||
if (pGC->fillStyle == FillStippled)
|
||||
{
|
||||
_igsSetStippledRect (cop,pGC->alu,planemask,pGC->fgPixel,p->offset,cmd);
|
||||
}
|
||||
else
|
||||
{
|
||||
_igsSetOpaqueStippledRect (cop,pGC->alu,planemask,
|
||||
pGC->fgPixel,pGC->bgPixel,p->offset,cmd);
|
||||
}
|
||||
while (nBox--)
|
||||
{
|
||||
_igsPatRect(cop,pBox->x1,pBox->y1,pBox->x2-pBox->x1,pBox->y2-pBox->y1,cmd);
|
||||
pBox++;
|
||||
}
|
||||
KdMarkSync (pDrawable->pScreen);
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
igsStipple (ScreenPtr pScreen,
|
||||
CARD32 cmd,
|
||||
FbStip *psrcBase,
|
||||
FbStride widthSrc,
|
||||
int srcx,
|
||||
int srcy,
|
||||
int dstx,
|
||||
int dsty,
|
||||
int width,
|
||||
int height)
|
||||
{
|
||||
SetupIgs(pScreen);
|
||||
FbStip *psrcLine, *psrc;
|
||||
FbStride widthRest;
|
||||
FbStip bits, tmp, lastTmp;
|
||||
int leftShift, rightShift;
|
||||
int nl, nlMiddle;
|
||||
int r;
|
||||
PixTransDeclare;
|
||||
|
||||
/* Compute blt address and parameters */
|
||||
psrc = psrcBase + srcy * widthSrc + (srcx >> 5);
|
||||
nlMiddle = (width + 31) >> 5;
|
||||
leftShift = srcx & 0x1f;
|
||||
rightShift = 32 - leftShift;
|
||||
widthRest = widthSrc - nlMiddle;
|
||||
|
||||
_igsPlaneBlt(cop,dstx,dsty,width,height,cmd);
|
||||
|
||||
if (leftShift == 0)
|
||||
{
|
||||
while (height--)
|
||||
{
|
||||
nl = nlMiddle;
|
||||
PixTransStart(nl);
|
||||
while (nl--)
|
||||
{
|
||||
tmp = *psrc++;
|
||||
IgsAdjustBits32 (tmp);
|
||||
PixTransStore (tmp);
|
||||
}
|
||||
psrc += widthRest;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
widthRest--;
|
||||
while (height--)
|
||||
{
|
||||
bits = *psrc++;
|
||||
nl = nlMiddle;
|
||||
PixTransStart(nl);
|
||||
while (nl--)
|
||||
{
|
||||
tmp = FbStipLeft(bits, leftShift);
|
||||
bits = *psrc++;
|
||||
tmp |= FbStipRight(bits, rightShift);
|
||||
IgsAdjustBits32(tmp);
|
||||
PixTransStore (tmp);
|
||||
}
|
||||
psrc += widthRest;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
igsCopyNtoN (DrawablePtr pSrcDrawable,
|
||||
DrawablePtr pDstDrawable,
|
||||
|
@ -164,6 +379,134 @@ igsCopyArea(DrawablePtr pSrcDrawable, DrawablePtr pDstDrawable, GCPtr pGC,
|
|||
srcx, srcy, width, height, dstx, dsty);
|
||||
}
|
||||
|
||||
typedef struct _igs1toNargs {
|
||||
unsigned long copyPlaneFG, copyPlaneBG;
|
||||
Bool opaque;
|
||||
} igs1toNargs;
|
||||
|
||||
void
|
||||
igsCopy1toN (DrawablePtr pSrcDrawable,
|
||||
DrawablePtr pDstDrawable,
|
||||
GCPtr pGC,
|
||||
BoxPtr pbox,
|
||||
int nbox,
|
||||
int dx,
|
||||
int dy,
|
||||
Bool reverse,
|
||||
Bool upsidedown,
|
||||
Pixel bitplane,
|
||||
void *closure)
|
||||
{
|
||||
SetupIgs(pDstDrawable->pScreen);
|
||||
|
||||
igs1toNargs *args = closure;
|
||||
int dstx, dsty;
|
||||
FbStip *psrcBase;
|
||||
FbStride widthSrc;
|
||||
int srcBpp;
|
||||
CARD32 cmd;
|
||||
|
||||
if (args->opaque && sourceInvarient (pGC->alu))
|
||||
{
|
||||
igsFillBoxSolid (pDstDrawable, nbox, pbox,
|
||||
pGC->bgPixel, pGC->alu, pGC->planemask);
|
||||
return;
|
||||
}
|
||||
|
||||
fbGetStipDrawable (pSrcDrawable, psrcBase, widthSrc, srcBpp);
|
||||
|
||||
if (args->opaque)
|
||||
{
|
||||
_igsSetOpaquePlaneBlt (cop, pGC->alu, pGC->planemask, args->copyPlaneFG,
|
||||
args->copyPlaneBG, cmd);
|
||||
}
|
||||
else
|
||||
{
|
||||
_igsSetTransparentPlaneBlt (cop, pGC->alu, pGC->planemask,
|
||||
args->copyPlaneFG, cmd);
|
||||
}
|
||||
|
||||
while (nbox--)
|
||||
{
|
||||
dstx = pbox->x1;
|
||||
dsty = pbox->y1;
|
||||
|
||||
igsStipple (pDstDrawable->pScreen, cmd,
|
||||
psrcBase, widthSrc,
|
||||
dstx + dx, dsty + dy,
|
||||
dstx, dsty,
|
||||
pbox->x2 - dstx, pbox->y2 - dsty);
|
||||
pbox++;
|
||||
}
|
||||
KdMarkSync (pDstDrawable->pScreen);
|
||||
}
|
||||
|
||||
RegionPtr
|
||||
igsCopyPlane (DrawablePtr pSrcDrawable,
|
||||
DrawablePtr pDstDrawable,
|
||||
GCPtr pGC,
|
||||
int srcx,
|
||||
int srcy,
|
||||
int width,
|
||||
int height,
|
||||
int dstx,
|
||||
int dsty,
|
||||
unsigned long bitPlane)
|
||||
{
|
||||
RegionPtr ret;
|
||||
igs1toNargs args;
|
||||
FbBits depthMask;
|
||||
|
||||
depthMask = FbFullMask (pDstDrawable->depth);
|
||||
if ((pGC->planemask & depthMask) == depthMask &&
|
||||
pDstDrawable->type == DRAWABLE_WINDOW &&
|
||||
pSrcDrawable->depth == 1)
|
||||
{
|
||||
args.copyPlaneFG = pGC->fgPixel;
|
||||
args.copyPlaneBG = pGC->bgPixel;
|
||||
args.opaque = TRUE;
|
||||
return fbDoCopy (pSrcDrawable, pDstDrawable, pGC,
|
||||
srcx, srcy, width, height,
|
||||
dstx, dsty, igsCopy1toN, bitPlane, &args);
|
||||
}
|
||||
return KdCheckCopyPlane(pSrcDrawable, pDstDrawable, pGC,
|
||||
srcx, srcy, width, height,
|
||||
dstx, dsty, bitPlane);
|
||||
}
|
||||
|
||||
#if 0
|
||||
/* would you believe this is slower than fb? */
|
||||
void
|
||||
igsPushPixels (GCPtr pGC,
|
||||
PixmapPtr pBitmap,
|
||||
DrawablePtr pDrawable,
|
||||
int w,
|
||||
int h,
|
||||
int x,
|
||||
int y)
|
||||
{
|
||||
igs1toNargs args;
|
||||
FbBits depthMask;
|
||||
|
||||
depthMask = FbFullMask (pDstDrawable->depth);
|
||||
if ((pGC->planemask & depthMask) == depthMask &&
|
||||
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, igsCopy1toN, 1, &args);
|
||||
}
|
||||
else
|
||||
{
|
||||
KdCheckPushPixels (pGC, pBitmap, pDrawable, w, h, x, y);
|
||||
}
|
||||
}
|
||||
#else
|
||||
#define igsPushPixels KdCheckPushPixels
|
||||
#endif
|
||||
|
||||
BOOL
|
||||
igsFillOk (GCPtr pGC)
|
||||
{
|
||||
|
@ -175,7 +518,6 @@ igsFillOk (GCPtr pGC)
|
|||
switch (pGC->fillStyle) {
|
||||
case FillSolid:
|
||||
return TRUE;
|
||||
#if 0
|
||||
case FillTiled:
|
||||
return (igsPatternDimOk (pGC->tile.pixmap->drawable.width) &&
|
||||
igsPatternDimOk (pGC->tile.pixmap->drawable.height));
|
||||
|
@ -183,7 +525,6 @@ igsFillOk (GCPtr pGC)
|
|||
case FillOpaqueStippled:
|
||||
return (igsPatternDimOk (pGC->stipple->drawable.width) &&
|
||||
igsPatternDimOk (pGC->stipple->drawable.height));
|
||||
#endif
|
||||
}
|
||||
return FALSE;
|
||||
}
|
||||
|
@ -200,6 +541,7 @@ igsFillSpans (DrawablePtr pDrawable, GCPtr pGC, int n,
|
|||
int nTmp;
|
||||
INT16 x, y;
|
||||
int width;
|
||||
IgsPattern *p;
|
||||
|
||||
if (!igsFillOk (pGC))
|
||||
{
|
||||
|
@ -224,17 +566,31 @@ igsFillSpans (DrawablePtr pDrawable, GCPtr pGC, int n,
|
|||
case FillSolid:
|
||||
_igsSetSolidRect(cop,pGC->alu,pGC->planemask,pGC->fgPixel,cmd);
|
||||
break;
|
||||
#if 0
|
||||
case FillTiled:
|
||||
cmd = igsTilePrepare (pGC->tile.pixmap,
|
||||
pGC->patOrg.x + pDrawable->x,
|
||||
pGC->patOrg.y + pDrawable->y,
|
||||
pGC->alu);
|
||||
p = igsSetPattern (pDrawable->pScreen,
|
||||
pGC->tile.pixmap,
|
||||
FillTiled,
|
||||
pGC->patOrg.x + pDrawable->x,
|
||||
pGC->patOrg.y + pDrawable->y);
|
||||
_igsSetTiledRect (cop,pGC->alu,pGC->planemask,p->offset,cmd);
|
||||
break;
|
||||
default:
|
||||
cmd = igsStipplePrepare (pDrawable, pGC);
|
||||
p = igsSetPattern (pDrawable->pScreen,
|
||||
pGC->stipple,
|
||||
pGC->fillStyle,
|
||||
pGC->patOrg.x + pDrawable->x,
|
||||
pGC->patOrg.y + pDrawable->y);
|
||||
if (pGC->fillStyle == FillStippled)
|
||||
{
|
||||
_igsSetStippledRect (cop,pGC->alu,pGC->planemask,
|
||||
pGC->fgPixel,p->offset,cmd);
|
||||
}
|
||||
else
|
||||
{
|
||||
_igsSetOpaqueStippledRect (cop,pGC->alu,pGC->planemask,
|
||||
pGC->fgPixel,pGC->bgPixel,p->offset,cmd);
|
||||
}
|
||||
break;
|
||||
#endif
|
||||
}
|
||||
while (n--)
|
||||
{
|
||||
|
@ -244,7 +600,7 @@ igsFillSpans (DrawablePtr pDrawable, GCPtr pGC, int n,
|
|||
width = *pwidth++;
|
||||
if (width)
|
||||
{
|
||||
_igsRect(cop,x,y,width,1,cmd);
|
||||
_igsPatRect(cop,x,y,width,1,cmd);
|
||||
}
|
||||
}
|
||||
DEALLOCATE_LOCAL(pptFree);
|
||||
|
@ -407,7 +763,6 @@ igsPolyFillRect (DrawablePtr pDrawable, GCPtr pGC,
|
|||
pboxClipped-pboxClippedBase, pboxClippedBase,
|
||||
pGC->fgPixel, pGC->alu, pGC->planemask);
|
||||
break;
|
||||
#if 0
|
||||
case FillTiled:
|
||||
igsFillBoxTiled(pDrawable,
|
||||
pboxClipped-pboxClippedBase, pboxClippedBase,
|
||||
|
@ -418,10 +773,9 @@ igsPolyFillRect (DrawablePtr pDrawable, GCPtr pGC,
|
|||
break;
|
||||
case FillStippled:
|
||||
case FillOpaqueStippled:
|
||||
igsFillBoxStipple (pDrawable, pGC,
|
||||
pboxClipped-pboxClippedBase, pboxClippedBase);
|
||||
igsFillBoxStippled (pDrawable, pGC,
|
||||
pboxClipped-pboxClippedBase, pboxClippedBase);
|
||||
break;
|
||||
#endif
|
||||
}
|
||||
}
|
||||
if (pboxClippedBase != stackRects)
|
||||
|
@ -834,6 +1188,12 @@ igsPolyGlyphBlt (DrawablePtr pDrawable,
|
|||
CharInfoPtr *ppci,
|
||||
pointer pglyphBase)
|
||||
{
|
||||
if (pGC->fillStyle != FillSolid ||
|
||||
fbGetGCPrivate(pGC)->pm != FB_ALLONES)
|
||||
{
|
||||
KdCheckPolyGlyphBlt (pDrawable, pGC, x, y, nglyph, ppci, pglyphBase);
|
||||
return;
|
||||
}
|
||||
x += pDrawable->x;
|
||||
y += pDrawable->y;
|
||||
|
||||
|
@ -860,6 +1220,11 @@ igsImageGlyphBlt (DrawablePtr pDrawable,
|
|||
CharInfoPtr *ppci,
|
||||
pointer pglyphBase)
|
||||
{
|
||||
if (fbGetGCPrivate(pGC)->pm != FB_ALLONES)
|
||||
{
|
||||
KdCheckImageGlyphBlt (pDrawable, pGC, x, y, nglyph, ppci, pglyphBase);
|
||||
return;
|
||||
}
|
||||
x += pDrawable->x;
|
||||
y += pDrawable->y;
|
||||
|
||||
|
@ -878,12 +1243,48 @@ igsImageGlyphBlt (DrawablePtr pDrawable,
|
|||
}
|
||||
}
|
||||
|
||||
static void
|
||||
igsInvalidatePattern (IgsPatternCache *c,
|
||||
PixmapPtr pPixmap)
|
||||
{
|
||||
int i;
|
||||
|
||||
if (c->base)
|
||||
{
|
||||
for (i = 0; i < IGS_NUM_PATTERN; i++)
|
||||
{
|
||||
if (c->pattern[i].serial_number == pPixmap->drawable.serialNumber)
|
||||
c->pattern[i].serial_number = ~0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
igsInitPattern (IgsPatternCache *c, int bsize, int psize)
|
||||
{
|
||||
int i;
|
||||
int boffset;
|
||||
int poffset;
|
||||
|
||||
for (i = 0; i < IGS_NUM_PATTERN; i++)
|
||||
{
|
||||
boffset = i * bsize;
|
||||
poffset = i * psize;
|
||||
c->pattern[i].xrot = -1;
|
||||
c->pattern[i].yrot = -1;
|
||||
c->pattern[i].serial_number = ~0;
|
||||
c->pattern[i].offset = c->offset + poffset;
|
||||
c->pattern[i].base = c->base + boffset;
|
||||
}
|
||||
c->next = 0;
|
||||
}
|
||||
|
||||
static const GCOps igsOps = {
|
||||
igsFillSpans,
|
||||
KdCheckSetSpans,
|
||||
KdCheckPutImage,
|
||||
igsCopyArea,
|
||||
KdCheckCopyPlane,
|
||||
igsCopyPlane,
|
||||
KdCheckPolyPoint,
|
||||
KdCheckPolylines,
|
||||
KdCheckPolySegment,
|
||||
|
@ -898,7 +1299,7 @@ static const GCOps igsOps = {
|
|||
miImageText16,
|
||||
igsImageGlyphBlt,
|
||||
igsPolyGlyphBlt,
|
||||
KdCheckPushPixels,
|
||||
igsPushPixels,
|
||||
#ifdef NEED_LINEHELPER
|
||||
,NULL
|
||||
#endif
|
||||
|
@ -985,7 +1386,6 @@ igsPaintWindow(WindowPtr pWin, RegionPtr pRegion, int what)
|
|||
(*pWin->drawable.pScreen->PaintWindowBackground)(pWin, pRegion,
|
||||
what);
|
||||
return;
|
||||
#if 0
|
||||
case BackgroundPixmap:
|
||||
pTile = pWin->background.pixmap;
|
||||
if (igsPatternDimOk (pTile->drawable.width) &&
|
||||
|
@ -999,7 +1399,6 @@ igsPaintWindow(WindowPtr pWin, RegionPtr pRegion, int what)
|
|||
return;
|
||||
}
|
||||
break;
|
||||
#endif
|
||||
case BackgroundPixel:
|
||||
igsFillBoxSolid((DrawablePtr)pWin,
|
||||
(int)REGION_NUM_RECTS(pRegion),
|
||||
|
@ -1017,7 +1416,6 @@ igsPaintWindow(WindowPtr pWin, RegionPtr pRegion, int what)
|
|||
pWin->border.pixel, GXcopy, ~0);
|
||||
return;
|
||||
}
|
||||
#if 0
|
||||
else
|
||||
{
|
||||
pTile = pWin->border.pixmap;
|
||||
|
@ -1032,7 +1430,6 @@ igsPaintWindow(WindowPtr pWin, RegionPtr pRegion, int what)
|
|||
return;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
break;
|
||||
}
|
||||
KdCheckPaintWindow (pWin, pRegion, what);
|
||||
|
@ -1041,6 +1438,15 @@ igsPaintWindow(WindowPtr pWin, RegionPtr pRegion, int what)
|
|||
Bool
|
||||
igsDrawInit (ScreenPtr pScreen)
|
||||
{
|
||||
KdScreenPriv(pScreen);
|
||||
igsCardInfo(pScreenPriv);
|
||||
igsScreenInfo(pScreenPriv);
|
||||
int i;
|
||||
int pattern_size;
|
||||
int boffset, poffset;
|
||||
|
||||
KdScreenInitAsync (pScreen);
|
||||
|
||||
/*
|
||||
* Replace various fb screen functions
|
||||
*/
|
||||
|
@ -1049,8 +1455,20 @@ igsDrawInit (ScreenPtr pScreen)
|
|||
pScreen->PaintWindowBackground = igsPaintWindow;
|
||||
pScreen->PaintWindowBorder = igsPaintWindow;
|
||||
|
||||
KdScreenInitAsync (pScreen);
|
||||
|
||||
/*
|
||||
* Initialize patterns
|
||||
*/
|
||||
if (igss->tile.base)
|
||||
{
|
||||
pattern_size = IgsTileSize(pScreenPriv->screen->fb[0].bitsPerPixel);
|
||||
igsInitPattern (&igss->tile,
|
||||
pattern_size,
|
||||
pattern_size * 8 / pScreenPriv->screen->fb[0].bitsPerPixel);
|
||||
pattern_size = IgsStippleSize(pScreenPriv->screen->fb[0].bitsPerPixel);
|
||||
igsInitPattern (&igss->stipple,
|
||||
pattern_size,
|
||||
pattern_size * 8 / pScreenPriv->screen->fb[0].bitsPerPixel);
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* $XFree86$
|
||||
* $XFree86: xc/programs/Xserver/hw/kdrive/igs/igsdraw.h,v 1.1 2000/05/06 22:17:43 keithp Exp $
|
||||
*
|
||||
* Copyright © 2000 Keith Packard
|
||||
*
|
||||
|
@ -46,9 +46,13 @@ extern CARD8 igsPatRop[];
|
|||
IGS_CONTROL_MALLWBEPTZ), \
|
||||
0)
|
||||
|
||||
#if 1
|
||||
#define _igsWaitFull(cop) _igsWaitLoop(cop, \
|
||||
IGS_CONTROL_CMDFF, \
|
||||
0)
|
||||
#else
|
||||
#define _igsWaitFull(cop) _igsWaitDone(cop)
|
||||
#endif
|
||||
|
||||
#define _igsWaitIdleEmpty(cop) _igsWaitDone(cop)
|
||||
#define _igsWaitHostBltAck(cop) _igsWaitLoop(cop, \
|
||||
|
@ -76,13 +80,27 @@ extern CARD8 igsPatRop[];
|
|||
v = ((v & 0x0f) << 4) | ((v >> 4) & 0x0f); \
|
||||
}
|
||||
|
||||
#define IgsAdjustBits32(b) IgsInvertBits32(b)
|
||||
#define IgsByteSwap32(x) ((x) = (((x) >> 24) | \
|
||||
(((x) >> 8) & 0xff00) | \
|
||||
(((x) << 8) & 0xff0000) | \
|
||||
((x) << 24)))
|
||||
|
||||
#define IgsByteSwap16(x) ((x) = ((x) << 8) | ((x) >> 8))
|
||||
|
||||
#define igsPatternDimOk(d) ((d) <= IGS_PATTERN_WIDTH && (((d) & ((d) - 1)) == 0))
|
||||
|
||||
#if BITMAP_BIT_ORDER == LSBFirst
|
||||
#define IgsAdjustBits32(b) IgsInvertBits32(b)
|
||||
#define IgsAdjustBits16(x) IgsInvertBits16(x)
|
||||
#else
|
||||
#define IgsAdjustBits32(x) IgsByteSwap32(x)
|
||||
#define IgsAdjustBits16(x) IgsByteSwap16(x)
|
||||
#endif
|
||||
|
||||
#define _igsSetSolidRect(cop,alu,pm,pix,cmd) {\
|
||||
_igsWaitFull(cop); \
|
||||
(cop)->mix = IGS_MAKE_MIX(alu,alu); \
|
||||
(cop)->fg = (pix); \
|
||||
(cop)->planemask = (pm); \
|
||||
(cmd) = (IGS_DRAW_T_B | \
|
||||
IGS_DRAW_L_R | \
|
||||
IGS_DRAW_ALL | \
|
||||
|
@ -94,6 +112,55 @@ extern CARD8 igsPatRop[];
|
|||
IGS_BGS_BG); \
|
||||
}
|
||||
|
||||
#define _igsSetTiledRect(cop,alu,pm,base,cmd) {\
|
||||
_igsWaitFull(cop); \
|
||||
(cop)->mix = IGS_MAKE_MIX(alu,alu); \
|
||||
(cop)->src1_stride = IGS_PATTERN_WIDTH - 1; \
|
||||
(cop)->src1_start = (base); \
|
||||
(cmd) = (IGS_DRAW_T_B | \
|
||||
IGS_DRAW_L_R | \
|
||||
IGS_DRAW_ALL | \
|
||||
IGS_PIXEL_TILE | \
|
||||
IGS_HBLT_DISABLE | \
|
||||
IGS_SRC2_NORMAL | \
|
||||
IGS_STEP_PXBLT | \
|
||||
IGS_FGS_SRC | \
|
||||
IGS_BGS_BG); \
|
||||
}
|
||||
|
||||
#define _igsSetStippledRect(cop,alu,pm,pix,base,cmd) {\
|
||||
_igsWaitFull(cop); \
|
||||
(cop)->mix = IGS_MAKE_MIX(alu,alu); \
|
||||
(cop)->src1_start = (base); \
|
||||
(cop)->fg = (pix); \
|
||||
(cmd) = (IGS_DRAW_T_B | \
|
||||
IGS_DRAW_L_R | \
|
||||
IGS_DRAW_ALL | \
|
||||
IGS_PIXEL_STIP_TRANS | \
|
||||
IGS_HBLT_DISABLE | \
|
||||
IGS_SRC2_NORMAL | \
|
||||
IGS_STEP_PXBLT | \
|
||||
IGS_FGS_FG | \
|
||||
IGS_BGS_BG); \
|
||||
}
|
||||
|
||||
#define _igsSetOpaqueStippledRect(cop,alu,pm,_fg,_bg,base,cmd) {\
|
||||
_igsWaitFull(cop); \
|
||||
(cop)->mix = IGS_MAKE_MIX(alu,alu); \
|
||||
(cop)->src1_start = (base); \
|
||||
(cop)->fg = (_fg); \
|
||||
(cop)->bg = (_bg); \
|
||||
(cmd) = (IGS_DRAW_T_B | \
|
||||
IGS_DRAW_L_R | \
|
||||
IGS_DRAW_ALL | \
|
||||
IGS_PIXEL_STIP_OPAQUE | \
|
||||
IGS_HBLT_DISABLE | \
|
||||
IGS_SRC2_NORMAL | \
|
||||
IGS_STEP_PXBLT | \
|
||||
IGS_FGS_FG | \
|
||||
IGS_BGS_BG); \
|
||||
}
|
||||
|
||||
#define _igsRect(cop,x,y,w,h,cmd) { \
|
||||
_igsWaitFull(cop); \
|
||||
(cop)->dst_start = (x) + (y) * (cop_stride); \
|
||||
|
@ -101,10 +168,17 @@ extern CARD8 igsPatRop[];
|
|||
(cop)->operation = (cmd); \
|
||||
}
|
||||
|
||||
#define _igsPatRect(cop,x,y,w,h,cmd) { \
|
||||
_igsWaitFull(cop); \
|
||||
(cop)->dst_start = (x) + (y) * (cop_stride); \
|
||||
(cop)->rotate = IGS_MAKE_ROTATE(x&7,y&7); \
|
||||
(cop)->dim = IGS_MAKE_DIM(w-1,h-1); \
|
||||
(cop)->operation = (cmd); \
|
||||
}
|
||||
|
||||
#define _igsSetBlt(cop,alu,pm,backwards,upsidedown,cmd) { \
|
||||
_igsWaitFull(cop); \
|
||||
(cop)->mix = IGS_MAKE_MIX(alu,GXnoop); \
|
||||
(cop)->planemask = (pm); \
|
||||
(cop)->mix = IGS_MAKE_MIX(alu,alu); \
|
||||
(cop)->src1_stride = cop_stride - 1; \
|
||||
(cmd) = (IGS_DRAW_ALL | \
|
||||
IGS_PIXEL_FG | \
|
||||
|
@ -134,9 +208,8 @@ extern CARD8 igsPatRop[];
|
|||
#define _igsSetTransparentPlaneBlt(cop,alu,pm,fg_pix,cmd) { \
|
||||
_igsWaitIdleEmpty(cop); \
|
||||
_igsPreparePlaneBlt(cop); \
|
||||
(cop)->mix = IGS_MAKE_MIX(igsPatRop[alu],igsPatRop[GXnoop]); \
|
||||
(cop)->mix = IGS_MAKE_MIX(igsPatRop[alu],igsPatRop[alu]); \
|
||||
(cop)->fg = (fg_pix); \
|
||||
(cop)->planemask = (pm); \
|
||||
(cmd) = (IGS_DRAW_T_B | \
|
||||
IGS_DRAW_L_R | \
|
||||
IGS_DRAW_ALL | \
|
||||
|
@ -152,7 +225,6 @@ extern CARD8 igsPatRop[];
|
|||
_igsWaitIdleEmpty(cop); \
|
||||
_igsPreparePlaneBlt(cop); \
|
||||
(cop)->mix = IGS_MAKE_MIX(igsPatRop[alu],igsPatRop[alu]); \
|
||||
(cop)->planemask = (pm); \
|
||||
(cop)->fg = (fg_pix); \
|
||||
(cop)->bg = (bg_pix); \
|
||||
(cmd) = (IGS_DRAW_T_B | \
|
||||
|
|
|
@ -0,0 +1,968 @@
|
|||
/*
|
||||
* $XFree86$
|
||||
*
|
||||
* Copyright © 2000 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 "igsreg.h"
|
||||
#include <stdio.h>
|
||||
|
||||
#define CR00 IGS_CR+0x00
|
||||
#define CR01 IGS_CR+0x01
|
||||
#define CR02 IGS_CR+0x02
|
||||
#define CR03 IGS_CR+0x03
|
||||
#define CR04 IGS_CR+0x04
|
||||
#define CR05 IGS_CR+0x05
|
||||
#define CR06 IGS_CR+0x06
|
||||
#define CR07 IGS_CR+0x07
|
||||
#define CR08 IGS_CR+0x08
|
||||
#define CR09 IGS_CR+0x09
|
||||
#define CR0A IGS_CR+0x0A
|
||||
#define CR0B IGS_CR+0x0B
|
||||
#define CR0C IGS_CR+0x0C
|
||||
#define CR0D IGS_CR+0x0D
|
||||
#define CR0E IGS_CR+0x0E
|
||||
#define CR0F IGS_CR+0x0F
|
||||
#define CR10 IGS_CR+0x10
|
||||
#define CR11 IGS_CR+0x11
|
||||
#define CR12 IGS_CR+0x12
|
||||
#define CR13 IGS_CR+0x13
|
||||
#define CR14 IGS_CR+0x14
|
||||
#define CR15 IGS_CR+0x15
|
||||
#define CR16 IGS_CR+0x16
|
||||
#define CR17 IGS_CR+0x17
|
||||
#define CR18 IGS_CR+0x18
|
||||
#define CR19 IGS_CR+0x19
|
||||
#define CR1A IGS_CR+0x1A
|
||||
#define CR1B IGS_CR+0x1B
|
||||
#define CR1C IGS_CR+0x1C
|
||||
#define CR1D IGS_CR+0x1D
|
||||
#define CR1E IGS_CR+0x1E
|
||||
#define CR1F IGS_CR+0x1F
|
||||
#define CR20 IGS_CR+0x20
|
||||
#define CR21 IGS_CR+0x21
|
||||
#define CR22 IGS_CR+0x22
|
||||
#define CR23 IGS_CR+0x23
|
||||
#define CR24 IGS_CR+0x24
|
||||
#define CR25 IGS_CR+0x25
|
||||
#define CR26 IGS_CR+0x26
|
||||
#define CR27 IGS_CR+0x27
|
||||
#define CR28 IGS_CR+0x28
|
||||
#define CR29 IGS_CR+0x29
|
||||
#define CR2A IGS_CR+0x2A
|
||||
#define CR2B IGS_CR+0x2B
|
||||
#define CR2C IGS_CR+0x2C
|
||||
#define CR2D IGS_CR+0x2D
|
||||
#define CR2E IGS_CR+0x2E
|
||||
#define CR2F IGS_CR+0x2F
|
||||
#define CR30 IGS_CR+0x30
|
||||
#define CR31 IGS_CR+0x31
|
||||
#define CR32 IGS_CR+0x32
|
||||
#define CR33 IGS_CR+0x33
|
||||
#define CR34 IGS_CR+0x34
|
||||
#define CR35 IGS_CR+0x35
|
||||
#define CR36 IGS_CR+0x36
|
||||
#define CR37 IGS_CR+0x37
|
||||
#define CR38 IGS_CR+0x38
|
||||
#define CR39 IGS_CR+0x39
|
||||
#define CR3A IGS_CR+0x3A
|
||||
#define CR3B IGS_CR+0x3B
|
||||
#define CR3C IGS_CR+0x3C
|
||||
#define CR3D IGS_CR+0x3D
|
||||
#define CR3E IGS_CR+0x3E
|
||||
#define CR3F IGS_CR+0x3F
|
||||
#define CR40 IGS_CR+0x40
|
||||
#define CR41 IGS_CR+0x41
|
||||
#define CR42 IGS_CR+0x42
|
||||
#define CR43 IGS_CR+0x43
|
||||
#define CR44 IGS_CR+0x44
|
||||
#define CR45 IGS_CR+0x45
|
||||
#define CR46 IGS_CR+0x46
|
||||
#define CR47 IGS_CR+0x47
|
||||
#define CR48 IGS_CR+0x48
|
||||
|
||||
#define CR_FIRST CR00
|
||||
#define CR_LAST CR48
|
||||
|
||||
#define SR00 IGS_SR+0x00
|
||||
#define SR01 IGS_SR+0x01
|
||||
#define SR02 IGS_SR+0x02
|
||||
#define SR03 IGS_SR+0x03
|
||||
#define SR04 IGS_SR+0x04
|
||||
|
||||
#define SR_FIRST SR00
|
||||
#define SR_LAST SR04
|
||||
|
||||
#define AR00 IGS_AR+0x00
|
||||
#define AR01 IGS_AR+0x01
|
||||
#define AR02 IGS_AR+0x02
|
||||
#define AR03 IGS_AR+0x03
|
||||
#define AR04 IGS_AR+0x04
|
||||
#define AR05 IGS_AR+0x05
|
||||
#define AR06 IGS_AR+0x06
|
||||
#define AR07 IGS_AR+0x07
|
||||
#define AR08 IGS_AR+0x08
|
||||
#define AR09 IGS_AR+0x09
|
||||
#define AR0A IGS_AR+0x0A
|
||||
#define AR0B IGS_AR+0x0B
|
||||
#define AR0C IGS_AR+0x0C
|
||||
#define AR0D IGS_AR+0x0D
|
||||
#define AR0E IGS_AR+0x0E
|
||||
#define AR0F IGS_AR+0x0F
|
||||
#define AR10 IGS_AR+0x10
|
||||
#define AR11 IGS_AR+0x11
|
||||
#define AR12 IGS_AR+0x12
|
||||
#define AR13 IGS_AR+0x13
|
||||
#define AR14 IGS_AR+0x14
|
||||
|
||||
#define AR_FIRST AR00
|
||||
#define AR_LAST AR14
|
||||
|
||||
#define GR00 IGS_GR+0x00
|
||||
#define GR01 IGS_GR+0x01
|
||||
#define GR02 IGS_GR+0x02
|
||||
#define GR03 IGS_GR+0x03
|
||||
#define GR04 IGS_GR+0x04
|
||||
#define GR05 IGS_GR+0x05
|
||||
#define GR06 IGS_GR+0x06
|
||||
#define GR07 IGS_GR+0x07
|
||||
#define GR08 IGS_GR+0x08
|
||||
#define GR09 IGS_GR+0x09
|
||||
#define GR0A IGS_GR+0x0A
|
||||
#define GR0B IGS_GR+0x0B
|
||||
#define GR0C IGS_GR+0x0C
|
||||
#define GR0D IGS_GR+0x0D
|
||||
#define GR0E IGS_GR+0x0E
|
||||
#define GR0F IGS_GR+0x0F
|
||||
#define GR10 IGS_GR+0x10
|
||||
#define GR11 IGS_GR+0x11
|
||||
#define GR12 IGS_GR+0x12
|
||||
#define GR13 IGS_GR+0x13
|
||||
#define GR14 IGS_GR+0x14
|
||||
#define GR15 IGS_GR+0x15
|
||||
#define GR16 IGS_GR+0x16
|
||||
#define GR17 IGS_GR+0x17
|
||||
#define GR18 IGS_GR+0x18
|
||||
#define GR19 IGS_GR+0x19
|
||||
#define GR1A IGS_GR+0x1A
|
||||
#define GR1B IGS_GR+0x1B
|
||||
#define GR1C IGS_GR+0x1C
|
||||
#define GR1D IGS_GR+0x1D
|
||||
#define GR1E IGS_GR+0x1E
|
||||
#define GR1F IGS_GR+0x1F
|
||||
#define GR20 IGS_GR+0x20
|
||||
#define GR21 IGS_GR+0x21
|
||||
#define GR22 IGS_GR+0x22
|
||||
#define GR23 IGS_GR+0x23
|
||||
#define GR24 IGS_GR+0x24
|
||||
#define GR25 IGS_GR+0x25
|
||||
#define GR26 IGS_GR+0x26
|
||||
#define GR27 IGS_GR+0x27
|
||||
#define GR28 IGS_GR+0x28
|
||||
#define GR29 IGS_GR+0x29
|
||||
#define GR2A IGS_GR+0x2A
|
||||
#define GR2B IGS_GR+0x2B
|
||||
#define GR2C IGS_GR+0x2C
|
||||
#define GR2D IGS_GR+0x2D
|
||||
#define GR2E IGS_GR+0x2E
|
||||
#define GR2F IGS_GR+0x2F
|
||||
#define GR30 IGS_GR+0x30
|
||||
#define GR31 IGS_GR+0x31
|
||||
#define GR32 IGS_GR+0x32
|
||||
#define GR33 IGS_GR+0x33
|
||||
#define GR34 IGS_GR+0x34
|
||||
#define GR35 IGS_GR+0x35
|
||||
#define GR36 IGS_GR+0x36
|
||||
#define GR37 IGS_GR+0x37
|
||||
#define GR38 IGS_GR+0x38
|
||||
#define GR39 IGS_GR+0x39
|
||||
#define GR3A IGS_GR+0x3A
|
||||
#define GR3B IGS_GR+0x3B
|
||||
#define GR3C IGS_GR+0x3C
|
||||
#define GR3D IGS_GR+0x3D
|
||||
#define GR3E IGS_GR+0x3E
|
||||
#define GR3F IGS_GR+0x3F
|
||||
#define GR40 IGS_GR+0x40
|
||||
#define GR41 IGS_GR+0x41
|
||||
#define GR42 IGS_GR+0x42
|
||||
#define GR43 IGS_GR+0x43
|
||||
#define GR44 IGS_GR+0x44
|
||||
#define GR45 IGS_GR+0x45
|
||||
#define GR46 IGS_GR+0x46
|
||||
#define GR47 IGS_GR+0x47
|
||||
#define GR48 IGS_GR+0x48
|
||||
#define GR49 IGS_GR+0x49
|
||||
#define GR4A IGS_GR+0x4A
|
||||
#define GR4B IGS_GR+0x4B
|
||||
#define GR4C IGS_GR+0x4C
|
||||
#define GR4D IGS_GR+0x4D
|
||||
#define GR4E IGS_GR+0x4E
|
||||
#define GR4F IGS_GR+0x4F
|
||||
#define GR50 IGS_GR+0x50
|
||||
#define GR51 IGS_GR+0x51
|
||||
#define GR52 IGS_GR+0x52
|
||||
#define GR53 IGS_GR+0x53
|
||||
#define GR54 IGS_GR+0x54
|
||||
#define GR55 IGS_GR+0x55
|
||||
#define GR56 IGS_GR+0x56
|
||||
#define GR57 IGS_GR+0x57
|
||||
#define GR58 IGS_GR+0x58
|
||||
#define GR59 IGS_GR+0x59
|
||||
#define GR5A IGS_GR+0x5A
|
||||
#define GR5B IGS_GR+0x5B
|
||||
#define GR5C IGS_GR+0x5C
|
||||
#define GR5D IGS_GR+0x5D
|
||||
#define GR5E IGS_GR+0x5E
|
||||
#define GR5F IGS_GR+0x5F
|
||||
#define GR60 IGS_GR+0x60
|
||||
#define GR61 IGS_GR+0x61
|
||||
#define GR62 IGS_GR+0x62
|
||||
#define GR63 IGS_GR+0x63
|
||||
#define GR64 IGS_GR+0x64
|
||||
#define GR65 IGS_GR+0x65
|
||||
#define GR66 IGS_GR+0x66
|
||||
#define GR67 IGS_GR+0x67
|
||||
#define GR68 IGS_GR+0x68
|
||||
#define GR69 IGS_GR+0x69
|
||||
#define GR6A IGS_GR+0x6A
|
||||
#define GR6B IGS_GR+0x6B
|
||||
#define GR6C IGS_GR+0x6C
|
||||
#define GR6D IGS_GR+0x6D
|
||||
#define GR6E IGS_GR+0x6E
|
||||
#define GR6F IGS_GR+0x6F
|
||||
#define GR70 IGS_GR+0x70
|
||||
#define GR71 IGS_GR+0x71
|
||||
#define GR72 IGS_GR+0x72
|
||||
#define GR73 IGS_GR+0x73
|
||||
#define GR74 IGS_GR+0x74
|
||||
#define GR75 IGS_GR+0x75
|
||||
#define GR76 IGS_GR+0x76
|
||||
#define GR77 IGS_GR+0x77
|
||||
#define GR78 IGS_GR+0x78
|
||||
#define GR79 IGS_GR+0x79
|
||||
#define GR7A IGS_GR+0x7A
|
||||
#define GR7B IGS_GR+0x7B
|
||||
#define GR7C IGS_GR+0x7C
|
||||
#define GR7D IGS_GR+0x7D
|
||||
#define GR7E IGS_GR+0x7E
|
||||
#define GR7F IGS_GR+0x7F
|
||||
#define GR80 IGS_GR+0x80
|
||||
#define GR81 IGS_GR+0x81
|
||||
#define GR82 IGS_GR+0x82
|
||||
#define GR83 IGS_GR+0x83
|
||||
#define GR84 IGS_GR+0x84
|
||||
#define GR85 IGS_GR+0x85
|
||||
#define GR86 IGS_GR+0x86
|
||||
#define GR87 IGS_GR+0x87
|
||||
#define GR88 IGS_GR+0x88
|
||||
#define GR89 IGS_GR+0x89
|
||||
#define GR8A IGS_GR+0x8A
|
||||
#define GR8B IGS_GR+0x8B
|
||||
#define GR8C IGS_GR+0x8C
|
||||
#define GR8D IGS_GR+0x8D
|
||||
#define GR8E IGS_GR+0x8E
|
||||
#define GR8F IGS_GR+0x8F
|
||||
#define GR90 IGS_GR+0x90
|
||||
#define GR91 IGS_GR+0x91
|
||||
#define GR92 IGS_GR+0x92
|
||||
#define GR93 IGS_GR+0x93
|
||||
#define GR94 IGS_GR+0x94
|
||||
#define GR95 IGS_GR+0x95
|
||||
#define GR96 IGS_GR+0x96
|
||||
#define GR97 IGS_GR+0x97
|
||||
#define GR98 IGS_GR+0x98
|
||||
#define GR99 IGS_GR+0x99
|
||||
#define GR9A IGS_GR+0x9A
|
||||
#define GR9B IGS_GR+0x9B
|
||||
#define GR9C IGS_GR+0x9C
|
||||
#define GR9D IGS_GR+0x9D
|
||||
#define GR9E IGS_GR+0x9E
|
||||
#define GR9F IGS_GR+0x9F
|
||||
#define GRA0 IGS_GR+0xA0
|
||||
#define GRA1 IGS_GR+0xA1
|
||||
#define GRA2 IGS_GR+0xA2
|
||||
#define GRA3 IGS_GR+0xA3
|
||||
#define GRA4 IGS_GR+0xA4
|
||||
#define GRA5 IGS_GR+0xA5
|
||||
#define GRA6 IGS_GR+0xA6
|
||||
#define GRA7 IGS_GR+0xA7
|
||||
#define GRA8 IGS_GR+0xA8
|
||||
#define GRA9 IGS_GR+0xA9
|
||||
#define GRAA IGS_GR+0xAA
|
||||
#define GRAB IGS_GR+0xAB
|
||||
#define GRAC IGS_GR+0xAC
|
||||
#define GRAD IGS_GR+0xAD
|
||||
#define GRAE IGS_GR+0xAE
|
||||
#define GRAF IGS_GR+0xAF
|
||||
#define GRB0 IGS_GR+0xB0
|
||||
#define GRB1 IGS_GR+0xB1
|
||||
#define GRB2 IGS_GR+0xB2
|
||||
#define GRB3 IGS_GR+0xB3
|
||||
#define GRB4 IGS_GR+0xB4
|
||||
#define GRB5 IGS_GR+0xB5
|
||||
#define GRB6 IGS_GR+0xB6
|
||||
#define GRB7 IGS_GR+0xB7
|
||||
#define GRB8 IGS_GR+0xB8
|
||||
#define GRB9 IGS_GR+0xB9
|
||||
#define GRBA IGS_GR+0xBA
|
||||
#define GRBB IGS_GR+0xBB
|
||||
#define GRBC IGS_GR+0xBC
|
||||
#define GRBD IGS_GR+0xBD
|
||||
#define GRBE IGS_GR+0xBE
|
||||
#define GRBF IGS_GR+0xBF
|
||||
|
||||
#define GR_FIRST GR00
|
||||
#define GR_LAST GRBF
|
||||
|
||||
#define GREX3C IGS_GREX+(0x3c-IGS_GREXBASE)
|
||||
|
||||
VgaReg igs_h_total[] = {
|
||||
CR00, 0, 8,
|
||||
VGA_REG_END
|
||||
};
|
||||
|
||||
VgaReg igs_h_de_end[] = {
|
||||
CR01, 0, 8,
|
||||
VGA_REG_END
|
||||
};
|
||||
|
||||
VgaReg igs_h_bstart[] = {
|
||||
CR02, 0, 8,
|
||||
VGA_REG_END
|
||||
};
|
||||
|
||||
VgaReg igs_h_bend[] = {
|
||||
CR03, 0, 5,
|
||||
CR05, 7, 1,
|
||||
VGA_REG_END
|
||||
};
|
||||
|
||||
VgaReg igs_de_skew[] = {
|
||||
CR03, 5, 2,
|
||||
VGA_REG_END
|
||||
};
|
||||
|
||||
VgaReg igs_ena_vr_access[] = {
|
||||
CR03, 7, 1,
|
||||
VGA_REG_END
|
||||
};
|
||||
|
||||
VgaReg igs_h_rstart[] = {
|
||||
CR04, 0, 8,
|
||||
VGA_REG_END
|
||||
};
|
||||
|
||||
VgaReg igs_h_rend[] = {
|
||||
CR05, 0, 5,
|
||||
VGA_REG_END
|
||||
};
|
||||
|
||||
VgaReg igs_h_rdelay[] = {
|
||||
CR05, 5, 2,
|
||||
VGA_REG_END
|
||||
};
|
||||
|
||||
VgaReg igs_v_total[] = {
|
||||
CR06, 0, 8,
|
||||
CR07, 0, 1,
|
||||
CR07, 5, 1,
|
||||
GR11, 0, 1,
|
||||
VGA_REG_END
|
||||
};
|
||||
|
||||
VgaReg igs_v_rstart[] = {
|
||||
CR10, 0, 8,
|
||||
CR07, 2, 1,
|
||||
CR07, 7, 1,
|
||||
GR11, 2, 1,
|
||||
VGA_REG_END
|
||||
};
|
||||
|
||||
VgaReg igs_v_rend[] = {
|
||||
CR11, 0, 4,
|
||||
VGA_REG_END
|
||||
};
|
||||
|
||||
VgaReg igs_clear_v_int[] = {
|
||||
CR11, 4, 1,
|
||||
VGA_REG_END
|
||||
};
|
||||
|
||||
VgaReg igs_disable_v_int[] = {
|
||||
CR11, 5, 1,
|
||||
VGA_REG_END
|
||||
};
|
||||
|
||||
VgaReg igs_bandwidth[] = {
|
||||
CR11, 6, 1,
|
||||
VGA_REG_END
|
||||
};
|
||||
|
||||
VgaReg igs_crt_protect[] = {
|
||||
CR11, 7, 1,
|
||||
VGA_REG_END
|
||||
};
|
||||
|
||||
VgaReg igs_v_de_end[] = {
|
||||
CR12, 0, 8,
|
||||
CR07, 1, 1,
|
||||
CR07, 6, 1,
|
||||
GR11, 1, 1,
|
||||
VGA_REG_END
|
||||
};
|
||||
|
||||
VgaReg igs_offset[] = {
|
||||
CR13, 0, 8,
|
||||
GR15, 4, 2,
|
||||
VGA_REG_END
|
||||
};
|
||||
|
||||
VgaReg igs_v_bstart[] = {
|
||||
CR15, 0, 8,
|
||||
CR07, 3, 1,
|
||||
CR09, 5, 1,
|
||||
GR11, 3, 1,
|
||||
VGA_REG_END
|
||||
};
|
||||
|
||||
VgaReg igs_v_bend[] = {
|
||||
CR16, 0, 7,
|
||||
VGA_REG_END
|
||||
};
|
||||
|
||||
VgaReg igs_linecomp[] = {
|
||||
CR18, 0, 8,
|
||||
CR07, 4, 1,
|
||||
CR09, 6, 1,
|
||||
GR11, 4, 1,
|
||||
VGA_REG_END
|
||||
};
|
||||
|
||||
VgaReg igs_ivideo[] = {
|
||||
GR11, 5, 1,
|
||||
VGA_REG_END
|
||||
};
|
||||
|
||||
VgaReg igs_num_fetch[] = {
|
||||
GR14, 0, 8,
|
||||
GR15, 0, 2,
|
||||
VGA_REG_END
|
||||
};
|
||||
|
||||
VgaReg igs_wcrt0[] = {
|
||||
CR1F, 0, 1,
|
||||
VGA_REG_END
|
||||
};
|
||||
|
||||
VgaReg igs_wcrt1[] = {
|
||||
CR1F, 1, 1,
|
||||
VGA_REG_END
|
||||
};
|
||||
|
||||
VgaReg igs_rcrts1[] = {
|
||||
CR1F, 4, 1,
|
||||
VGA_REG_END
|
||||
};
|
||||
|
||||
VgaReg igs_selwk[] = {
|
||||
CR1F, 6, 1,
|
||||
VGA_REG_END
|
||||
};
|
||||
|
||||
VgaReg igs_dot_clock_8[] = {
|
||||
SR01, 0, 1,
|
||||
VGA_REG_END
|
||||
};
|
||||
|
||||
VgaReg igs_screen_off[] = {
|
||||
SR01, 5, 1,
|
||||
VGA_REG_END
|
||||
};
|
||||
|
||||
VgaReg igs_enable_write_plane[] = {
|
||||
SR02, 0, 4,
|
||||
VGA_REG_END
|
||||
};
|
||||
|
||||
VgaReg igs_mexhsyn[] = {
|
||||
GR16, 0, 2,
|
||||
VGA_REG_END
|
||||
};
|
||||
|
||||
VgaReg igs_mexvsyn[] = {
|
||||
GR16, 2, 2,
|
||||
VGA_REG_END
|
||||
};
|
||||
|
||||
VgaReg igs_pci_burst_write[] = {
|
||||
GR30, 5, 1,
|
||||
VGA_REG_END
|
||||
};
|
||||
|
||||
VgaReg igs_pci_burst_read[] = {
|
||||
GR30, 7, 1,
|
||||
VGA_REG_END
|
||||
};
|
||||
|
||||
VgaReg igs_iow_retry[] = {
|
||||
GREX3C, 0, 1,
|
||||
VGA_REG_END
|
||||
};
|
||||
|
||||
VgaReg igs_mw_retry[] = {
|
||||
GREX3C, 1, 1,
|
||||
VGA_REG_END
|
||||
};
|
||||
|
||||
VgaReg igs_mr_retry[] = {
|
||||
GREX3C, 2, 1,
|
||||
VGA_REG_END
|
||||
};
|
||||
|
||||
|
||||
|
||||
VgaReg igs_biga22en[] = {
|
||||
GR3D, 4, 1,
|
||||
VGA_REG_END
|
||||
};
|
||||
|
||||
VgaReg igs_biga24en[] = {
|
||||
GR3D, 5, 1,
|
||||
VGA_REG_END
|
||||
};
|
||||
|
||||
VgaReg igs_biga22force[] = {
|
||||
GR3D, 6, 1,
|
||||
VGA_REG_END
|
||||
};
|
||||
|
||||
VgaReg igs_bigswap[] = {
|
||||
GR3F, 0, 6,
|
||||
VGA_REG_END
|
||||
};
|
||||
|
||||
/* #define IGS_BIGSWAP_8 0x3f */
|
||||
/* #define IGS_BIGSWAP_16 0x2a */
|
||||
/* #define IGS_BIGSWAP_32 0x00 */
|
||||
|
||||
VgaReg igs_sprite_x[] = {
|
||||
GR50, 0, 8,
|
||||
GR51, 0, 3,
|
||||
VGA_REG_END
|
||||
};
|
||||
|
||||
VgaReg igs_sprite_preset_x[] = {
|
||||
GR52, 0, 6,
|
||||
VGA_REG_END
|
||||
};
|
||||
|
||||
VgaReg igs_sprite_y[] = {
|
||||
GR53, 0, 8,
|
||||
GR54, 0, 3,
|
||||
VGA_REG_END
|
||||
};
|
||||
|
||||
VgaReg igs_sprite_preset_y[] = {
|
||||
GR55, 0, 6,
|
||||
VGA_REG_END
|
||||
};
|
||||
|
||||
VgaReg igs_sprite_visible[] = {
|
||||
GR56, 0, 1,
|
||||
VGA_REG_END
|
||||
};
|
||||
|
||||
VgaReg igs_sprite_64x64[] = {
|
||||
GR56, 1, 1,
|
||||
VGA_REG_END
|
||||
};
|
||||
|
||||
VgaReg igs_mgrext[] = {
|
||||
GR57, 0, 1,
|
||||
VGA_REG_END
|
||||
};
|
||||
|
||||
VgaReg igs_hcshf[] = {
|
||||
GR57, 4, 2,
|
||||
VGA_REG_END
|
||||
};
|
||||
|
||||
VgaReg igs_mbpfix[] = {
|
||||
GR57, 6, 2,
|
||||
VGA_REG_END
|
||||
};
|
||||
|
||||
VgaReg igs_overscan_red[] = {
|
||||
GR58, 0, 8,
|
||||
VGA_REG_END
|
||||
};
|
||||
|
||||
VgaReg igs_overscan_green[] = {
|
||||
GR59, 0, 8,
|
||||
VGA_REG_END
|
||||
};
|
||||
|
||||
VgaReg igs_overscan_blue[] = {
|
||||
GR5A, 0, 8,
|
||||
VGA_REG_END
|
||||
};
|
||||
|
||||
VgaReg igs_memgopg[] = {
|
||||
GR73, 2, 1,
|
||||
VGA_REG_END
|
||||
};
|
||||
|
||||
VgaReg igs_memr2wpg[] = {
|
||||
GR73, 1, 1,
|
||||
VGA_REG_END
|
||||
};
|
||||
|
||||
VgaReg igs_crtff16[] = {
|
||||
GR73, 3, 1,
|
||||
VGA_REG_END
|
||||
};
|
||||
|
||||
VgaReg igs_fifomust[] = {
|
||||
GR74, 0, 5,
|
||||
VGA_REG_END
|
||||
};
|
||||
|
||||
VgaReg igs_fifogen[] = {
|
||||
GR75, 0, 5,
|
||||
VGA_REG_END
|
||||
};
|
||||
|
||||
VgaReg igs_mode_sel[] = {
|
||||
GR77, 0, 4,
|
||||
VGA_REG_END
|
||||
};
|
||||
|
||||
/* #define IGS_MODE_TEXT 0 */
|
||||
/* #define IGS_MODE_8 1 */
|
||||
/* #define IGS_MODE_565 2 */
|
||||
/* #define IGS_MODE_5551 6 */
|
||||
/* #define IGS_MODE_8888 3 */
|
||||
/* #define IGS_MODE_888 4 */
|
||||
/* #define IGS_MODE_332 9 */
|
||||
/* #define IGS_MODE_4444 10 */
|
||||
|
||||
VgaReg igs_sprite_addr[] = {
|
||||
GR7E, 0, 8,
|
||||
GR7F, 0, 4,
|
||||
VGA_REG_END
|
||||
};
|
||||
|
||||
VgaReg igs_fastmpie[] = {
|
||||
GR9E, 0, 1,
|
||||
VGA_REG_END
|
||||
};
|
||||
|
||||
VgaReg igs_vclk_m[] = {
|
||||
GRB0, 0, 8,
|
||||
GRBA, 0, 3,
|
||||
VGA_REG_END
|
||||
};
|
||||
|
||||
VgaReg igs_vclk_n[] = {
|
||||
GRB1, 0, 5,
|
||||
GRBA, 3, 3,
|
||||
VGA_REG_END
|
||||
};
|
||||
|
||||
VgaReg igs_vfsel[] = {
|
||||
GRB1, 5, 1,
|
||||
VGA_REG_END
|
||||
};
|
||||
|
||||
VgaReg igs_vclk_p[] = {
|
||||
GRB1, 6, 2,
|
||||
GRBA, 6, 1,
|
||||
VGA_REG_END
|
||||
};
|
||||
|
||||
VgaReg igs_frqlat[] = {
|
||||
GRB9, 7, 1,
|
||||
VGA_REG_END
|
||||
};
|
||||
|
||||
|
||||
VgaReg igs_dac_mask[] = {
|
||||
IGS_DAC + 0, 0, 8,
|
||||
VGA_REG_END
|
||||
};
|
||||
|
||||
VgaReg igs_dac_read_index[] = {
|
||||
IGS_DAC + 1, 0, 8,
|
||||
VGA_REG_END
|
||||
};
|
||||
|
||||
VgaReg igs_dac_write_index[] = {
|
||||
IGS_DAC + 2, 0, 8,
|
||||
VGA_REG_END
|
||||
};
|
||||
|
||||
VgaReg igs_dac_data[] = {
|
||||
IGS_DAC + 3, 0, 8,
|
||||
VGA_REG_END
|
||||
};
|
||||
|
||||
VgaReg igs_rampwdn[] = {
|
||||
IGS_DACEX + 0, 0, 1,
|
||||
VGA_REG_END
|
||||
};
|
||||
|
||||
VgaReg igs_dac6_8[] = {
|
||||
IGS_DACEX + 0, 1, 1,
|
||||
VGA_REG_END
|
||||
};
|
||||
|
||||
VgaReg igs_ramdacbypass[] = {
|
||||
IGS_DACEX + 0, 4, 1,
|
||||
VGA_REG_END
|
||||
};
|
||||
|
||||
VgaReg igs_dacpwdn[] = {
|
||||
IGS_DACEX + 0, 6, 1,
|
||||
VGA_REG_END
|
||||
};
|
||||
|
||||
VgaReg igs_cursor_read_index[] = {
|
||||
IGS_DACEX + 1, 0, 8,
|
||||
VGA_REG_END
|
||||
};
|
||||
|
||||
VgaReg igs_cursor_write_index[] = {
|
||||
IGS_DACEX + 2, 0, 8,
|
||||
VGA_REG_END
|
||||
};
|
||||
|
||||
VgaReg igs_cursor_data[] = {
|
||||
IGS_DACEX + 3, 0, 8,
|
||||
VGA_REG_END
|
||||
};
|
||||
|
||||
VGA8
|
||||
_igsInb (VgaCard *card, VGA16 port)
|
||||
{
|
||||
VGAVOL8 *reg;
|
||||
|
||||
if (card->closure)
|
||||
return VgaReadMemb ((VGA32) card->closure + port);
|
||||
else
|
||||
return VgaInb (port);
|
||||
}
|
||||
|
||||
void
|
||||
_igsOutb (VgaCard *card, VGA8 value, VGA16 port)
|
||||
{
|
||||
if (card->closure)
|
||||
VgaWriteMemb (value, (VGA32) card->closure + port);
|
||||
else
|
||||
VgaOutb (value, port);
|
||||
}
|
||||
|
||||
void
|
||||
_igsRegMap (VgaCard *card, VGA16 reg, VgaMap *map, VGABOOL write)
|
||||
{
|
||||
if (reg < IGS_SR + IGS_NSR)
|
||||
{
|
||||
map->access = VgaAccessIndIo;
|
||||
map->port = 0x3c4;
|
||||
map->addr = 0;
|
||||
map->value = 1;
|
||||
map->index = reg - IGS_SR;
|
||||
}
|
||||
else if (reg < IGS_GR + IGS_NGR)
|
||||
{
|
||||
map->access = VgaAccessIndIo;
|
||||
map->port = 0x3ce;
|
||||
map->addr = 0;
|
||||
map->value = 1;
|
||||
map->index = reg - IGS_GR;
|
||||
}
|
||||
else if (reg < IGS_GREX + IGS_NGREX)
|
||||
{
|
||||
VGA8 gr33;
|
||||
|
||||
map->access = VgaAccessDone;
|
||||
_igsOutb (card, 0x33, 0x3ce);
|
||||
gr33 = _igsInb (card, 0x3cf);
|
||||
_igsOutb (card, gr33 | 0x40, 0x3cf);
|
||||
_igsOutb (card, IGS_GREXBASE + reg - IGS_GREX, 0x3ce);
|
||||
if (write)
|
||||
_igsOutb (card, map->value, 0x3cf);
|
||||
else
|
||||
map->value = _igsInb (card, 0x3cf);
|
||||
_igsOutb (card, 0x33, 0x3ce);
|
||||
_igsOutb (card, gr33, 0x3cf);
|
||||
return;
|
||||
}
|
||||
else if (reg < IGS_AR + IGS_NAR)
|
||||
{
|
||||
reg -= IGS_AR;
|
||||
map->access = VgaAccessDone;
|
||||
/* reset AFF to index */
|
||||
(void) _igsInb (card, 0x3da);
|
||||
if (reg >= 16)
|
||||
reg |= 0x20;
|
||||
_igsOutb (card, reg, 0x3c0);
|
||||
if (write)
|
||||
_igsOutb (card, map->value, 0x3c0);
|
||||
else
|
||||
map->value = _igsInb (card, 0x3c1);
|
||||
if (!(reg & 0x20))
|
||||
{
|
||||
/* enable video display again */
|
||||
(void) _igsInb (card, 0x3da);
|
||||
_igsOutb (card, 0x20, 0x3c0);
|
||||
}
|
||||
return;
|
||||
}
|
||||
else if (reg < IGS_CR + IGS_NCR)
|
||||
{
|
||||
map->access = VgaAccessIndIo;
|
||||
map->port = 0x3d4;
|
||||
map->addr = 0;
|
||||
map->value = 1;
|
||||
map->index = reg - IGS_CR;
|
||||
}
|
||||
else if (reg < IGS_DAC + IGS_NDAC)
|
||||
{
|
||||
map->access = VgaAccessIo;
|
||||
map->port = 0x3c6 + reg - IGS_DAC;
|
||||
}
|
||||
else if (reg < IGS_DACEX + IGS_NDACEX)
|
||||
{
|
||||
VGA8 gr56;
|
||||
reg = 0x3c6 + reg - IGS_DACEX;
|
||||
map->access = VgaAccessDone;
|
||||
_igsOutb (card, 0x56, 0x3ce);
|
||||
gr56 = _igsInb (card, 0x3cf);
|
||||
_igsOutb (card, gr56 | 4, 0x3cf);
|
||||
if (write)
|
||||
_igsOutb (card, map->value, reg);
|
||||
else
|
||||
map->value = _igsInb (card, reg);
|
||||
_igsOutb (card, gr56, 0x3cf);
|
||||
return;
|
||||
}
|
||||
else switch (reg) {
|
||||
case IGS_MISC_OUT:
|
||||
map->access = VgaAccessIo;
|
||||
if (write)
|
||||
map->port = 0x3c2;
|
||||
else
|
||||
map->port = 0x3cc;
|
||||
break;
|
||||
case IGS_INPUT_STATUS_1:
|
||||
map->access = VgaAccessIo;
|
||||
map->port = 0x3da;
|
||||
break;
|
||||
}
|
||||
if (card->closure)
|
||||
{
|
||||
map->port = map->port + (VGA32) card->closure;
|
||||
if (map->access == VgaAccessIo)
|
||||
map->access = VgaAccessMem;
|
||||
if (map->access == VgaAccessIndIo)
|
||||
map->access = VgaAccessIndMem;
|
||||
}
|
||||
}
|
||||
|
||||
VgaSave igsSaves[] = {
|
||||
CR00, CR18,
|
||||
SR01, SR02,
|
||||
GR11, GRBA,
|
||||
IGS_MISC_OUT, IGS_MISC_OUT,
|
||||
VGA_SAVE_END
|
||||
};
|
||||
|
||||
void
|
||||
igsRegInit (IgsVga *igsvga, VGAVOL8 *mmio)
|
||||
{
|
||||
igsvga->card.map = _igsRegMap;
|
||||
igsvga->card.closure = (void *) mmio;
|
||||
igsvga->card.max = IGS_NREG;
|
||||
igsvga->card.values = igsvga->values;
|
||||
igsvga->card.saves = igsSaves;
|
||||
}
|
||||
|
||||
void
|
||||
igsSave (IgsVga *igsvga)
|
||||
{
|
||||
igsSetImm (igsvga, igs_wcrt0, 1);
|
||||
igsSetImm (igsvga, igs_wcrt1, 1);
|
||||
igsSetImm (igsvga, igs_rcrts1, 1);
|
||||
igsSetImm (igsvga, igs_selwk, 1);
|
||||
VgaPreserve (&igsvga->card);
|
||||
}
|
||||
|
||||
void
|
||||
igsReset (IgsVga *igsvga)
|
||||
{
|
||||
VgaRestore (&igsvga->card);
|
||||
igsSetImm (igsvga, igs_frqlat, 0);
|
||||
igsSetImm (igsvga, igs_frqlat, 1);
|
||||
igsSetImm (igsvga, igs_frqlat, 0);
|
||||
VgaFinish (&igsvga->card);
|
||||
}
|
||||
|
||||
char *
|
||||
igsRegName(char *buf, VGA16 reg)
|
||||
{
|
||||
if (reg < IGS_SR + IGS_NSR)
|
||||
{
|
||||
sprintf (buf, " SR%02X", reg - IGS_SR);
|
||||
}
|
||||
else if (reg < IGS_GR + IGS_NGR)
|
||||
{
|
||||
sprintf (buf, " GR%02X", reg - IGS_GR);
|
||||
}
|
||||
else if (reg < IGS_GREX + IGS_NGREX)
|
||||
{
|
||||
sprintf (buf, " GRX%02X", reg - IGS_GREX + IGS_GREXBASE);
|
||||
}
|
||||
else if (reg < IGS_AR + IGS_NAR)
|
||||
{
|
||||
sprintf (buf, " AR%02X", reg - IGS_AR);
|
||||
}
|
||||
else if (reg < IGS_CR + IGS_NCR)
|
||||
{
|
||||
sprintf (buf, " CR%02X", reg - IGS_CR);
|
||||
}
|
||||
else if (reg < IGS_DAC + IGS_NDAC)
|
||||
{
|
||||
sprintf (buf, " DAC%02X", reg - IGS_DAC);
|
||||
}
|
||||
else if (reg < IGS_DACEX + IGS_NDACEX)
|
||||
{
|
||||
sprintf (buf, "DACX%02X", reg - IGS_DACEX);
|
||||
}
|
||||
else switch (reg) {
|
||||
case IGS_MISC_OUT:
|
||||
sprintf (buf, "MISC_O");
|
||||
break;
|
||||
case IGS_INPUT_STATUS_1:
|
||||
sprintf (buf, "IN_S_1");
|
||||
break;
|
||||
}
|
||||
return buf;
|
||||
}
|
|
@ -0,0 +1,70 @@
|
|||
/*
|
||||
* $XFree86$
|
||||
*
|
||||
* Copyright © 2000 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.
|
||||
*/
|
||||
|
||||
#ifndef _IGSREG_H_
|
||||
#define _IGSREG_H_
|
||||
|
||||
#include "vga.h"
|
||||
|
||||
#define IGS_SR 0
|
||||
#define IGS_NSR 5
|
||||
#define IGS_GR (IGS_SR+IGS_NSR)
|
||||
#define IGS_NGR 0xC0
|
||||
#define IGS_GREX (IGS_GR+IGS_NGR)
|
||||
#define IGS_GREXBASE 0x3c
|
||||
#define IGS_NGREX 1
|
||||
#define IGS_AR (IGS_GREX+IGS_NGREX)
|
||||
#define IGS_NAR 0x15
|
||||
#define IGS_CR (IGS_AR+IGS_NAR)
|
||||
#define IGS_NCR 0x48
|
||||
#define IGS_DAC (IGS_CR+IGS_NCR)
|
||||
#define IGS_NDAC 4
|
||||
#define IGS_DACEX (IGS_DAC+IGS_NDAC)
|
||||
#define IGS_NDACEX 4
|
||||
#define IGS_MISC_OUT (IGS_DACEX + IGS_NDACEX)
|
||||
#define IGS_INPUT_STATUS_1 (IGS_MISC_OUT+1)
|
||||
#define IGS_NREG (IGS_INPUT_STATUS_1+1)
|
||||
|
||||
#include "igsregs.t"
|
||||
|
||||
#define igsGet(sv,r) VgaGet(&(sv)->card, (r))
|
||||
#define igsGetImm(sv,r) VgaGetImm(&(sv)->card, (r))
|
||||
#define igsSet(sv,r,v) VgaSet(&(sv)->card, (r), (v))
|
||||
#define igsSetImm(sv,r,v) VgaSetImm(&(sv)->card, (r), (v))
|
||||
|
||||
typedef struct _igsVga {
|
||||
VgaCard card;
|
||||
VgaValue values[IGS_NREG];
|
||||
} IgsVga;
|
||||
|
||||
void
|
||||
igsRegInit (IgsVga *igsvga, VGAVOL8 *mmio);
|
||||
|
||||
void
|
||||
igsSave (IgsVga *igsvga);
|
||||
|
||||
void
|
||||
igsReset (IgsVga *igsvga);
|
||||
|
||||
#endif /* _IGSREG_H_ */
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* $XFree86$
|
||||
* $XFree86: xc/programs/Xserver/hw/kdrive/igs/igsstub.c,v 1.1 2000/05/06 22:17:44 keithp Exp $
|
||||
*
|
||||
* Copyright © 2000 Keith Packard
|
||||
*
|
||||
|
@ -31,7 +31,13 @@ InitCard (char *name)
|
|||
CARD32 count;
|
||||
|
||||
count = 0;
|
||||
#ifdef EMBED
|
||||
attr.address[0] = 0x10000000; /* Adomo Wing video base address */
|
||||
attr.io = 0;
|
||||
attr.naddr = 1;
|
||||
#else
|
||||
while (LinuxFindPci (0x10ea, 0x5000, count, &attr))
|
||||
#endif
|
||||
{
|
||||
KdCardInfoAdd (&igsFuncs, &attr, 0);
|
||||
count++;
|
||||
|
|
Loading…
Reference in New Issue