Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/sys/dev/pci Accelerate scrolling. Originally by Roland Dowde...
details: https://anonhg.NetBSD.org/src/rev/a6aaceaf10b4
branches: trunk
changeset: 472385:a6aaceaf10b4
user: ross <ross%NetBSD.org@localhost>
date: Wed Apr 28 23:24:33 1999 +0000
description:
Accelerate scrolling. Originally by Roland Dowdeswell, revised by
{drocher,ross}@netbsd.org.
diffstat:
sys/dev/pci/tga.c | 241 +++++++++++++++++++++++++++++++++++++++++++++++++++--
1 files changed, 231 insertions(+), 10 deletions(-)
diffs (278 lines):
diff -r 3f247d662241 -r a6aaceaf10b4 sys/dev/pci/tga.c
--- a/sys/dev/pci/tga.c Wed Apr 28 22:47:44 1999 +0000
+++ b/sys/dev/pci/tga.c Wed Apr 28 23:24:33 1999 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: tga.c,v 1.13 1999/03/24 05:51:21 mrg Exp $ */
+/* $NetBSD: tga.c,v 1.14 1999/04/28 23:24:33 ross Exp $ */
/*
* Copyright (c) 1995, 1996 Carnegie-Mellon University.
@@ -72,13 +72,29 @@
struct tga_devconfig tga_console_dc;
+int tga_ioctl __P((void *, u_long, caddr_t, int, struct proc *));
+int tga_mmap __P((void *, off_t, int));
+static void tga_copyrows __P((void *, int, int, int));
+static void tga_copycols __P((void *, int, int, int, int));
+static int tga_alloc_screen __P((void *, const struct wsscreen_descr *,
+ void **, int *, int *, long *));
+static void tga_free_screen __P((void *, void *));
+static void tga_show_screen __P((void *, void *));
+static int tga_rop __P((struct raster *, int, int, int, int, int,
+ struct raster *, int, int));
+static int tga_rop_nosrc __P((struct raster *, int, int, int, int, int));
+static int tga_rop_htov __P((struct raster *, int, int, int, int,
+ int, struct raster *, int, int ));
+static int tga_rop_vtov __P((struct raster *, int, int, int, int,
+ int, struct raster *, int, int ));
+
struct wsdisplay_emulops tga_emulops = {
rcons_cursor, /* could use hardware cursor; punt */
rcons_mapchar,
rcons_putchar,
- rcons_copycols,
+ tga_copycols,
rcons_erasecols,
- rcons_copyrows,
+ tga_copyrows,
rcons_eraserows,
rcons_alloc_attr
};
@@ -100,13 +116,6 @@
sizeof(_tga_scrlist) / sizeof(struct wsscreen_descr *), _tga_scrlist
};
-int tga_ioctl __P((void *, u_long, caddr_t, int, struct proc *));
-int tga_mmap __P((void *, off_t, int));
-static int tga_alloc_screen __P((void *, const struct wsscreen_descr *,
- void **, int *, int *, long *));
-static void tga_free_screen __P((void *, void *));
-static void tga_show_screen __P((void *, void *));
-
struct wsdisplay_accessops tga_accessops = {
tga_ioctl,
tga_mmap,
@@ -238,6 +247,7 @@
rap->depth = tgac->tgac_phys_depth;
rap->linelongs = dc->dc_rowbytes / sizeof(u_int32_t);
rap->pixels = (u_int32_t *)dc->dc_videobase;
+ rap->data = (caddr_t)dc;
/* initialize the raster console blitter */
rcp = &dc->dc_rcons;
@@ -652,3 +662,214 @@
curposp->x = curposp->y = 64;
return (0);
}
+
+/*
+ * Copy columns (characters) in a row (line).
+ */
+void
+tga_copycols(id, row, srccol, dstcol, ncols)
+ void *id;
+ int row, srccol, dstcol, ncols;
+{
+ struct rcons *rc = id;
+ int y, srcx, dstx, nx;
+
+ y = rc->rc_yorigin + rc->rc_font->height * row;
+ srcx = rc->rc_xorigin + rc->rc_font->width * srccol;
+ dstx = rc->rc_xorigin + rc->rc_font->width * dstcol;
+ nx = rc->rc_font->width * ncols;
+
+ tga_rop(rc->rc_sp, dstx, y,
+ nx, rc->rc_font->height, RAS_SRC,
+ rc->rc_sp, srcx, y);
+}
+
+/*
+ * Copy rows (lines).
+ */
+void
+tga_copyrows(id, srcrow, dstrow, nrows)
+ void *id;
+ int srcrow, dstrow, nrows;
+{
+ struct rcons *rc = id;
+ int srcy, dsty, ny;
+
+ srcy = rc->rc_yorigin + rc->rc_font->height * srcrow;
+ dsty = rc->rc_yorigin + rc->rc_font->height * dstrow;
+ ny = rc->rc_font->height * nrows;
+
+ tga_rop(rc->rc_sp, rc->rc_xorigin, dsty,
+ rc->rc_raswidth, ny, RAS_SRC,
+ rc->rc_sp, rc->rc_xorigin, srcy);
+}
+
+/* Do we need the src? */
+static int needsrc[16] = { 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0 };
+
+/* A mapping between our API and the TGA card */
+static int map_rop[16] = { 0x0, 0x8, 0x4, 0xc, 0x2, 0xa, 0x6,
+ 0xe, 0x1, 0x9, 0x5, 0xd, 0x3, 0xb, 0x7, 0xf
+};
+
+/*
+ * Generic TGA raster op.
+ * This covers all possible raster ops, and
+ * clips the sizes and all of that.
+ */
+static int
+tga_rop(dst, dx, dy, w, h, rop, src, sx, sy)
+ struct raster *dst;
+ int dx, dy, w, h, rop;
+ struct raster *src;
+ int sx, sy;
+{
+ if (!dst)
+ return -1;
+ if (dst->data == NULL)
+ return -1; /* we should be writing to a screen */
+ if (needsrc[RAS_GETOP(rop)]) {
+ if (src == (struct raster *) 0)
+ return -1; /* We want a src */
+ /* Clip against src */
+ if (sx < 0) {
+ w += sx;
+ sx = 0;
+ }
+ if (sy < 0) {
+ h += sy;
+ sy = 0;
+ }
+ if (sx + w > src->width)
+ w = src->width - sx;
+ if (sy + h > src->height)
+ h = src->height - sy;
+ } else {
+ if (src != (struct raster *) 0)
+ return -1; /* We need no src */
+ }
+ /* Clip against dst. We modify src regardless of using it,
+ * since it really doesn't matter.
+ */
+ if (dx < 0) {
+ w += dx;
+ sx -= dx;
+ dx = 0;
+ }
+ if (dy < 0) {
+ h += dy;
+ sy -= dy;
+ dy = 0;
+ }
+ if (dx + w > dst->width)
+ w = dst->width - dx;
+ if (dy + h > dst->height)
+ h = dst->height - dy;
+ if (w <= 0 || h <= 0)
+ return 0; /* Vacuously true; */
+ if (!src)
+ return tga_rop_nosrc(dst, dx, dy, w, h, rop);
+ if (src->data == NULL)
+ return tga_rop_htov(dst, dx, dy, w, h, rop, src, sx, sy);
+ else
+ return tga_rop_vtov(dst, dx, dy, w, h, rop, src, sx, sy);
+}
+
+/*
+ * No source raster ops.
+ * This function deals with all raster ops that don't require a src.
+ */
+static int
+tga_rop_nosrc(dst, dx, dy, w, h, rop)
+ struct raster *dst;
+ int dx, dy, w, h, rop;
+{
+ return raster_op(dst, dx, dy, w, h, rop, NULL, 0, 0);
+}
+
+/*
+ * Host to Video raster ops.
+ * This function deals with all raster ops that have a src that is host memory.
+ */
+static int
+tga_rop_htov(dst, dx, dy, w, h, rop, src, sx, sy)
+ struct raster *dst;
+ int dx, dy, w, h, rop;
+ struct raster *src;
+ int sx, sy;
+{
+ return raster_op(dst, dx, dy, w, h, rop, src, sx, sy);
+}
+
+/*
+ * Video to Video raster ops.
+ * This function deals with all raster ops that have a src and dst
+ * that are on the card.
+ */
+static int
+tga_rop_vtov(dst, dx, dy, w, h, rop, src, sx, sy)
+ struct raster *dst;
+ int dx, dy, w, h, rop;
+ struct raster *src;
+ int sx, sy;
+{
+ struct tga_devconfig *dc = (struct tga_devconfig *)dst->data;
+ tga_reg_t *regs0 = dc->dc_regs;
+ tga_reg_t *regs1 = regs0 + 16 * 1024; /* register alias 1 */
+ tga_reg_t *regs2 = regs1 + 16 * 1024; /* register alias 2 */
+ tga_reg_t *regs3 = regs2 + 16 * 1024; /* register alias 3 */
+ int srcb, dstb;
+ int x, y;
+ int xstart, xend, xdir, xinc;
+ int ystart, yend, ydir, yinc;
+ int offset = 1 * dc->dc_tgaconf->tgac_vvbr_units;
+
+ /*
+ * I don't yet want to deal with unaligned guys, really. And we don't
+ * deal with copies from one card to another.
+ */
+ if (dx % 8 != 0 || sx % 8 != 0 || src != dst)
+ return raster_op(dst, dx, dy, w, h, rop, src, sx, sy);
+
+ if (sy >= dy) {
+ ystart = 0;
+ yend = h;
+ ydir = 1;
+ } else {
+ ystart = h;
+ yend = 0;
+ ydir = -1;
+ }
+ if (sx >= dx) {
+ xstart = 0;
+ xend = w * (dst->depth / 8);
+ xdir = 1;
+ } else {
+ xstart = w * (dst->depth / 8);
+ xend = 0;
+ xdir = -1;
+ }
+ xinc = xdir * 4 * 64;
+ yinc = ydir * dst->linelongs * 4;
+ ystart *= dst->linelongs * 4;
+ yend *= dst->linelongs * 4;
+ srcb = offset + sy * src->linelongs * 4 + sx;
+ dstb = offset + dy * dst->linelongs * 4 + dx;
+ regs3[TGA_REG_GMOR] = 0x0007; /* Copy mode */
+ regs3[TGA_REG_GOPR] = map_rop[rop]; /* Set up the op */
+ for (y = ystart; (ydir * y) < (ydir * yend); y += yinc) {
+ for (x = xstart; (xdir * x) < (xdir * xend); x += xinc) {
+ regs0[TGA_REG_GCSR] = srcb + y + x + 3 * 64;
+ regs0[TGA_REG_GCDR] = dstb + y + x + 3 * 64;
+ regs1[TGA_REG_GCSR] = srcb + y + x + 2 * 64;
+ regs1[TGA_REG_GCDR] = dstb + y + x + 2 * 64;
+ regs2[TGA_REG_GCSR] = srcb + y + x + 1 * 64;
+ regs2[TGA_REG_GCDR] = dstb + y + x + 1 * 64;
+ regs3[TGA_REG_GCSR] = srcb + y + x + 0 * 64;
+ regs3[TGA_REG_GCDR] = dstb + y + x + 0 * 64;
+ }
+ }
+ regs0[TGA_REG_GOPR] = 0x0003; /* op -> dst = src */
+ regs0[TGA_REG_GMOR] = 0x0000; /* Simple mode */
+ return 0;
+}
Home |
Main Index |
Thread Index |
Old Index