PERFORCE change 76946 for review
Marcel Moolenaar
marcel at FreeBSD.org
Fri May 13 14:52:14 PDT 2005
http://perforce.freebsd.org/chv.cgi?CH=76946
Change 76946 by marcel at marcel_nfs on 2005/05/13 21:51:51
Implement BitBlt operations CTOFB, FBTOFB and H1TOFB. Both CTOFB
and FBTOFB use write mode 0. H1TOFB uses write mode 3.
The implementation is not feature complete. It is assumed for now
that the width is always a multiple of 8 bits and that the
bit offset is also a multiple of 8. Some VGA magic with masks and
rotate registers is needed to handle all possible cases. As long
as we're using fonts of width 8, this is not an issue so we're
good for now.
Affected files ...
.. //depot/projects/tty/sys/dev/vga/vga.c#11 edit
Differences ...
==== //depot/projects/tty/sys/dev/vga/vga.c#11 (text+ko) ====
@@ -33,6 +33,7 @@
#include <machine/resource.h>
#include <sys/bus.h>
#include <sys/rman.h>
+#include <sys/vtc.h>
#include <dev/ic/vga.h>
#include <dev/vga/vga.h>
@@ -186,7 +187,7 @@
REG_WRITE(sc, VGA_GC_ADDRESS, VGA_GC_SET_RESET);
REG_WRITE(sc, VGA_GC_DATA, 0);
REG_WRITE(sc, VGA_GC_ADDRESS, VGA_GC_ENABLE_SET_RESET);
- REG_WRITE(sc, VGA_GC_DATA, 0);
+ REG_WRITE(sc, VGA_GC_DATA, 0x0f);
REG_WRITE(sc, VGA_GC_ADDRESS, VGA_GC_COLOR_COMPARE);
REG_WRITE(sc, VGA_GC_DATA, 0);
REG_WRITE(sc, VGA_GC_ADDRESS, VGA_GC_DATA_ROTATE);
@@ -267,12 +268,133 @@
return (0);
}
+static __inline int
+vga_bitblt_ctofb(struct vga_softc *sc, u_long c, u_long dst, int width,
+ int height)
+{
+ int w;
+
+ REG_WRITE(sc, VGA_GC_ADDRESS, VGA_GC_MODE);
+ REG_WRITE(sc, VGA_GC_DATA, 0);
+ REG_WRITE(sc, VGA_GC_ADDRESS, VGA_GC_ENABLE_SET_RESET);
+ REG_WRITE(sc, VGA_GC_DATA, 0x0f);
+ REG_WRITE(sc, VGA_GC_ADDRESS, VGA_GC_SET_RESET);
+ REG_WRITE(sc, VGA_GC_DATA, c & 0x0f);
+ REG_WRITE(sc, VGA_GC_ADDRESS, VGA_GC_DATA_ROTATE);
+ REG_WRITE(sc, VGA_GC_DATA, 0);
+ dst >>= 3;
+ while (height > 0) {
+ for (w = 0; w < width; w += 8) {
+ MEM_READ(sc, dst);
+ MEM_WRITE(sc, dst++, 0);
+ }
+ dst += (640 - w) >> 3;
+ height--;
+ }
+ return (0);
+}
+
+static __inline int
+vga_bitblt_fbtofb(struct vga_softc *sc, u_long src, u_long dst, int width,
+ int height)
+{
+ int w;
+
+ REG_WRITE(sc, VGA_GC_ADDRESS, VGA_GC_MODE);
+ REG_WRITE(sc, VGA_GC_DATA, 0);
+ REG_WRITE(sc, VGA_GC_ADDRESS, VGA_GC_ENABLE_SET_RESET);
+ REG_WRITE(sc, VGA_GC_DATA, 0x0f);
+ REG_WRITE(sc, VGA_GC_ADDRESS, VGA_GC_SET_RESET);
+ REG_WRITE(sc, VGA_GC_DATA, 0);
+ REG_WRITE(sc, VGA_GC_ADDRESS, VGA_GC_DATA_ROTATE);
+ REG_WRITE(sc, VGA_GC_DATA, VGA_GC_DR_FS_OR);
+ dst >>= 3;
+ src >>= 3;
+ while (height > 0) {
+ for (w = 0; w < width; w += 8) {
+ MEM_READ(sc, src++);
+ MEM_WRITE(sc, dst++, 0);
+ }
+ src += (640 - w) >> 3;
+ dst += (640 - w) >> 3;
+ height--;
+ }
+ return (0);
+}
+
+static __inline int
+vga_bitblt_h1tofb(struct vga_softc *sc, uint8_t *src, u_long dst, int width,
+ int height, int bgclr, int fgclr)
+{
+ int c, w;
+ uint8_t b;
+
+ REG_WRITE(sc, VGA_GC_ADDRESS, VGA_GC_MODE);
+ REG_WRITE(sc, VGA_GC_DATA, 3);
+ REG_WRITE(sc, VGA_GC_ADDRESS, VGA_GC_ENABLE_SET_RESET);
+ REG_WRITE(sc, VGA_GC_DATA, 0x0f);
+ REG_WRITE(sc, VGA_GC_ADDRESS, VGA_GC_SET_RESET);
+ REG_WRITE(sc, VGA_GC_DATA, fgclr);
+ REG_WRITE(sc, VGA_GC_ADDRESS, VGA_GC_DATA_ROTATE);
+ REG_WRITE(sc, VGA_GC_DATA, 0);
+ c = fgclr;
+ dst >>= 3;
+ while (height > 0) {
+ for (w = 0; w < width; w += 8) {
+ b = *src++;
+ if (b != 0) {
+ if (c != fgclr) {
+ REG_WRITE(sc, VGA_GC_ADDRESS,
+ VGA_GC_SET_RESET);
+ REG_WRITE(sc, VGA_GC_DATA, fgclr);
+ c = fgclr;
+ }
+ MEM_READ(sc, dst);
+ MEM_WRITE(sc, dst, b);
+ }
+ if (b != 0xff) {
+ if (c != bgclr) {
+ REG_WRITE(sc, VGA_GC_ADDRESS,
+ VGA_GC_SET_RESET);
+ REG_WRITE(sc, VGA_GC_DATA, bgclr);
+ c = bgclr;
+ }
+ MEM_READ(sc, dst);
+ MEM_WRITE(sc, dst, ~b);
+ }
+ dst++;
+ }
+ dst += (640 - w) >> 3;
+ height--;
+ }
+ return (0);
+}
+
int
-vga_vbitblt(struct vga_softc *sc, int op, uintptr_t dst, uintptr_t src,
+vga_vbitblt(struct vga_softc *sc, int op, uintptr_t src, uintptr_t dst,
int width, int height, va_list ap)
{
+ int bgclr, fgclr;
+ int error;
- return (0);
+ switch (op) {
+ case BITBLT_FBTOFB:
+ error = vga_bitblt_fbtofb(sc, src, dst, width, height);
+ break;
+ case BITBLT_H1TOFB:
+ bgclr = va_arg(ap, int);
+ fgclr = va_arg(ap, int);
+ error = vga_bitblt_h1tofb(sc, (uint8_t *)src, dst, width,
+ height, bgclr, fgclr);
+ break;
+ case BITBLT_CTOFB:
+ error = vga_bitblt_ctofb(sc, src, dst, width, height);
+ break;
+ default:
+ error = EINVAL;
+ break;
+ }
+ return (error);
}
int
More information about the p4-projects
mailing list