Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/sys/dev/pci split putchar into separate methods for bitmap a...



details:   https://anonhg.NetBSD.org/src/rev/684088354f7d
branches:  trunk
changeset: 772434:684088354f7d
user:      macallan <macallan%NetBSD.org@localhost>
date:      Wed Jan 04 07:56:35 2012 +0000

description:
split putchar into separate methods for bitmap and alpha fonts, use
FONT_IS_ALPHA()

diffstat:

 sys/dev/pci/r128fb.c |  327 ++++++++++++++++++++++++++++----------------------
 1 files changed, 180 insertions(+), 147 deletions(-)

diffs (truncated from 451 to 300 lines):

diff -r b14f6caf0dde -r 684088354f7d sys/dev/pci/r128fb.c
--- a/sys/dev/pci/r128fb.c      Wed Jan 04 03:43:34 2012 +0000
+++ b/sys/dev/pci/r128fb.c      Wed Jan 04 07:56:35 2012 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: r128fb.c,v 1.23 2011/12/28 09:29:03 macallan Exp $     */
+/*     $NetBSD: r128fb.c,v 1.24 2012/01/04 07:56:35 macallan Exp $     */
 
 /*
  * Copyright (c) 2007 Michael Lorenz
@@ -31,7 +31,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: r128fb.c,v 1.23 2011/12/28 09:29:03 macallan Exp $");
+__KERNEL_RCSID(0, "$NetBSD: r128fb.c,v 1.24 2012/01/04 07:56:35 macallan Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -123,6 +123,7 @@
 
 static void    r128fb_cursor(void *, int, int, int);
 static void    r128fb_putchar(void *, int, int, u_int, long);
+static void    r128fb_putchar_aa(void *, int, int, u_int, long);
 static void    r128fb_copycols(void *, int, int, int, int);
 static void    r128fb_erasecols(void *, int, int, int, long);
 static void    r128fb_copyrows(void *, int, int, int);
@@ -287,11 +288,10 @@
        } else {
                /* steal rasops' ANSI cmap */
                for (i = 0; i < 256; i++) {
-                       sc->sc_cmap_red[i] = rasops_cmap[j];
-                       sc->sc_cmap_green[i] = rasops_cmap[j + 1];
-                       sc->sc_cmap_blue[i] = rasops_cmap[j + 2];
-                       r128fb_putpalreg(sc, i, rasops_cmap[j], rasops_cmap[j + 1],
-                           rasops_cmap[j + 2]);
+                       sc->sc_cmap_red[i] = i;
+                       sc->sc_cmap_green[i] = i;
+                       sc->sc_cmap_blue[i] = i;
+                       r128fb_putpalreg(sc, i, i, i, i);
                        j += 3;
                }
        }
@@ -534,7 +534,10 @@
        ri->ri_ops.eraserows = r128fb_eraserows;
        ri->ri_ops.erasecols = r128fb_erasecols;
        ri->ri_ops.cursor = r128fb_cursor;
-       ri->ri_ops.putchar = r128fb_putchar;
+       if (FONT_IS_ALPHA(ri->ri_font)) {
+               ri->ri_ops.putchar = r128fb_putchar_aa;
+       } else
+               ri->ri_ops.putchar = r128fb_putchar;
 }
 
 static int
@@ -628,15 +631,16 @@
 static void
 r128fb_init(struct r128fb_softc *sc)
 {
-       uint32_t datatype;
+       uint32_t datatype, d, reg;
 
        r128fb_flush_engine(sc);
 
        r128fb_wait(sc, 9);
        bus_space_write_4(sc->sc_memt, sc->sc_regh, R128_CRTC_OFFSET, 0);
        bus_space_write_4(sc->sc_memt, sc->sc_regh, R128_DEFAULT_OFFSET, 0);
+       /* pitch is in units of 8 pixels */
        bus_space_write_4(sc->sc_memt, sc->sc_regh, R128_DEFAULT_PITCH,
-           sc->sc_stride >> 3);
+           sc->sc_width >> 3);
        bus_space_write_4(sc->sc_memt, sc->sc_regh, R128_AUX_SC_CNTL, 0);
        bus_space_write_4(sc->sc_memt, sc->sc_regh,
            R128_DEFAULT_SC_BOTTOM_RIGHT,
@@ -648,18 +652,19 @@
            R128_DEFAULT_SC_BOTTOM_RIGHT,
            R128_DEFAULT_SC_RIGHT_MAX | R128_DEFAULT_SC_BOTTOM_MAX);
 
+#if 0
 #if BYTE_ORDER == BIG_ENDIAN
        bus_space_write_4(sc->sc_memt, sc->sc_regh, R128_DP_DATATYPE,
            R128_HOST_BIG_ENDIAN_EN);
 #else
        bus_space_write_4(sc->sc_memt, sc->sc_regh, R128_DP_DATATYPE, 0);
 #endif
-
-       r128fb_wait(sc, 5);
+#endif
+       r128fb_wait(sc, 7);
        bus_space_write_4(sc->sc_memt, sc->sc_regh, R128_SRC_PITCH,
-           sc->sc_stride >> 3);
+           sc->sc_width >> 3);
        bus_space_write_4(sc->sc_memt, sc->sc_regh, R128_DST_PITCH,
-           sc->sc_stride >> 3);
+           sc->sc_width >> 3);
        bus_space_write_4(sc->sc_memt, sc->sc_regh, R128_SRC_OFFSET, 0);
        bus_space_write_4(sc->sc_memt, sc->sc_regh, R128_DST_OFFSET, 0);
        bus_space_write_4(sc->sc_memt, sc->sc_regh, R128_DP_WRITE_MASK,
@@ -668,18 +673,23 @@
        switch (sc->sc_depth) {
                case 8:
                        datatype = R128_GMC_DST_8BPP_CI;
+                       d = R128_CRTC_COLOR_8BIT;
                        break;
                case 15:
                        datatype = R128_GMC_DST_15BPP;
+                       d = R128_CRTC_COLOR_15BIT;
                        break;
                case 16:
                        datatype = R128_GMC_DST_16BPP;
+                       d = R128_CRTC_COLOR_16BIT;
                        break;
                case 24:
                        datatype = R128_GMC_DST_24BPP;
+                       d = R128_CRTC_COLOR_24BIT;
                        break;
                case 32:
                        datatype = R128_GMC_DST_32BPP;
+                       d = R128_CRTC_COLOR_32BIT;
                        break;
                default:
                        aprint_error("%s: unsupported depth %d\n",
@@ -688,7 +698,12 @@
        }
        sc->sc_master_cntl = R128_GMC_CLR_CMP_CNTL_DIS |
            R128_GMC_AUX_CLIP_DIS | datatype;
-
+       reg = bus_space_read_4(sc->sc_memt, sc->sc_regh, R128_CRTC_GEN_CNTL);
+       DPRINTF("depth: %d\n", reg & R128_CRTC_PIX_WIDTH);
+       reg &= ~R128_CRTC_PIX_WIDTH;
+       reg |= d;
+       bus_space_write_4(sc->sc_memt, sc->sc_regh, R128_CRTC_GEN_CNTL, reg);
+       bus_space_write_4(sc->sc_memt, sc->sc_regh, R128_CRTC_PITCH, sc->sc_width >> 3);
        r128fb_flush_engine(sc);
 }
 
@@ -811,6 +826,7 @@
        fg = ri->ri_devcmap[(attr >> 24) & 0xf];
        x = ri->ri_xorigin + col * wi;
        y = ri->ri_yorigin + row * he;
+
        if (c == 0x20) {
                r128fb_rectfill(sc, x, y, wi, he, bg);
                return;
@@ -818,158 +834,175 @@
 
        uc = c - font->firstchar;
        data = (uint8_t *)font->data + uc * ri->ri_fontscale;
-       if (font->stride < wi) {
-               /* this is a mono bitmap font */
 
-               r128fb_wait(sc, 8);
+       r128fb_wait(sc, 8);
 
-               bus_space_write_4(sc->sc_memt, sc->sc_regh, 
-                   R128_DP_GUI_MASTER_CNTL,
-                   R128_GMC_BRUSH_SOLID_COLOR |
-                   R128_GMC_SRC_DATATYPE_MONO_FG_BG |
-                   R128_ROP3_S |
-                   R128_DP_SRC_SOURCE_HOST_DATA |
-                   R128_GMC_DST_CLIPPING |
-                   sc->sc_master_cntl);
+       bus_space_write_4(sc->sc_memt, sc->sc_regh, 
+           R128_DP_GUI_MASTER_CNTL,
+           R128_GMC_BRUSH_SOLID_COLOR |
+           R128_GMC_SRC_DATATYPE_MONO_FG_BG |
+           R128_ROP3_S |
+           R128_DP_SRC_SOURCE_HOST_DATA |
+           R128_GMC_DST_CLIPPING |
+           sc->sc_master_cntl);
 
-               bus_space_write_4(sc->sc_memt, sc->sc_regh, 
-                   R128_DP_CNTL, 
-                   R128_DST_Y_TOP_TO_BOTTOM | 
-                   R128_DST_X_LEFT_TO_RIGHT);
+       bus_space_write_4(sc->sc_memt, sc->sc_regh, 
+           R128_DP_CNTL, 
+           R128_DST_Y_TOP_TO_BOTTOM | 
+           R128_DST_X_LEFT_TO_RIGHT);
 
-               bus_space_write_4(sc->sc_memt, sc->sc_regh, 
-                   R128_DP_SRC_FRGD_CLR, fg);
-               bus_space_write_4(sc->sc_memt, sc->sc_regh, 
-                   R128_DP_SRC_BKGD_CLR, bg);
+       bus_space_write_4(sc->sc_memt, sc->sc_regh, 
+           R128_DP_SRC_FRGD_CLR, fg);
+       bus_space_write_4(sc->sc_memt, sc->sc_regh, 
+           R128_DP_SRC_BKGD_CLR, bg);
 
-               /*
-                * The Rage 128 doesn't have anything to skip pixels
-                * when colour expanding but all coordinates
-                * are signed so we just clip the leading bytes and 
-                * trailing bits away
-                */
-               bus_space_write_4(sc->sc_memt, sc->sc_regh, 
-                   R128_SC_RIGHT, x + wi - 1);
-               bus_space_write_4(sc->sc_memt, sc->sc_regh, 
-                   R128_SC_LEFT, x);
+       /*
+        * The Rage 128 doesn't have anything to skip pixels
+        * when colour expanding but all coordinates
+        * are signed so we just clip the leading bytes and 
+        * trailing bits away
+        */
+       bus_space_write_4(sc->sc_memt, sc->sc_regh, 
+           R128_SC_RIGHT, x + wi - 1);
+       bus_space_write_4(sc->sc_memt, sc->sc_regh, 
+           R128_SC_LEFT, x);
 
-               /* needed? */
-               bus_space_write_4(sc->sc_memt, sc->sc_regh, R128_SRC_X_Y, 0);
+       /* needed? */
+       bus_space_write_4(sc->sc_memt, sc->sc_regh, R128_SRC_X_Y, 0);
 
-               offset = 32 - (ri->ri_font->stride << 3);
-               bus_space_write_4(sc->sc_memt, sc->sc_regh, R128_DST_X_Y,
-                   ((x - offset) << 16) | y);
-               bus_space_write_4(sc->sc_memt, sc->sc_regh,
-                   R128_DST_WIDTH_HEIGHT, (32 << 16) | he);
+       offset = 32 - (font->stride << 3);
+       bus_space_write_4(sc->sc_memt, sc->sc_regh, R128_DST_X_Y,
+           ((x - offset) << 16) | y);
+       bus_space_write_4(sc->sc_memt, sc->sc_regh,
+           R128_DST_WIDTH_HEIGHT, (32 << 16) | he);
 
-               r128fb_wait(sc, he);
-               switch (ri->ri_font->stride) {
-                       case 1: {
-                               uint8_t *data8 = data;
-                               uint32_t reg;
-                               for (i = 0; i < he; i++) {
-                                       reg = *data8;
-                                       bus_space_write_stream_4(sc->sc_memt, 
-                                           sc->sc_regh,
-                                           R128_HOST_DATA0, reg);
-                                       data8++;
-                               }
-                               break;
+       r128fb_wait(sc, he);
+       switch (font->stride) {
+               case 1: {
+                       uint8_t *data8 = data;
+                       uint32_t reg;
+                       for (i = 0; i < he; i++) {
+                               reg = *data8;
+                               bus_space_write_stream_4(sc->sc_memt, 
+                                   sc->sc_regh, R128_HOST_DATA0, reg);
+                               data8++;
                        }
-                       case 2: {
-                               uint16_t *data16 = data;
-                               uint32_t reg;
-                               for (i = 0; i < he; i++) {
-                                       reg = *data16;
-                                       bus_space_write_stream_4(sc->sc_memt, 
-                                           sc->sc_regh,
-                                           R128_HOST_DATA0, reg);
-                                       data16++;
-                               }
-                               break;
+                       break;
+               }
+               case 2: {
+                       uint16_t *data16 = data;
+                       uint32_t reg;
+                       for (i = 0; i < he; i++) {
+                               reg = *data16;
+                               bus_space_write_stream_4(sc->sc_memt, 
+                                   sc->sc_regh, R128_HOST_DATA0, reg);
+                               data16++;
                        }
+                       break;
                }
-       } else {
-               /*
-                * this is an alpha font
-                * for now we only support this in 8 bit r3g3b2 colour
-                */
-               uint32_t latch = 0, bg8, fg8, pixel;
-               int r, g, b, aval;
-               int r1, g1, b1, r0, g0, b0, fgo, bgo;
-               uint8_t *data8 = data;
+       }
+}
 
-               r128fb_wait(sc, 5);
-               bus_space_write_4(sc->sc_memt, sc->sc_regh, 
-                   R128_DP_GUI_MASTER_CNTL,
-                   R128_GMC_BRUSH_SOLID_COLOR |
-                   R128_GMC_SRC_DATATYPE_COLOR |
-                   R128_ROP3_S |
-                   R128_DP_SRC_SOURCE_HOST_DATA |
-                   sc->sc_master_cntl);
+static void
+r128fb_putchar_aa(void *cookie, int row, int col, u_int c, long attr)
+{
+       struct rasops_info *ri = cookie;
+       struct wsdisplay_font *font = PICK_FONT(ri, c);
+       struct vcons_screen *scr = ri->ri_hw;
+       struct r128fb_softc *sc = scr->scr_cookie;



Home | Main Index | Thread Index | Old Index