Source-Changes-HG archive

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

[src/trunk]: src/sys/arch/sparc/dev support anti-aliased fonts, glyphcache etc.



details:   https://anonhg.NetBSD.org/src/rev/d41271ef310d
branches:  trunk
changeset: 815108:d41271ef310d
user:      macallan <macallan%NetBSD.org@localhost>
date:      Sat Apr 30 05:23:03 2016 +0000

description:
support anti-aliased fonts, glyphcache etc.

diffstat:

 sys/arch/sparc/dev/cgfourteen.c    |  289 +++++++++++++++++++-----------------
 sys/arch/sparc/dev/cgfourteenvar.h |    3 +-
 2 files changed, 151 insertions(+), 141 deletions(-)

diffs (truncated from 458 to 300 lines):

diff -r 4b02f9d594bc -r d41271ef310d sys/arch/sparc/dev/cgfourteen.c
--- a/sys/arch/sparc/dev/cgfourteen.c   Sat Apr 30 05:22:19 2016 +0000
+++ b/sys/arch/sparc/dev/cgfourteen.c   Sat Apr 30 05:23:03 2016 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: cgfourteen.c,v 1.79 2014/07/25 08:10:34 dholland Exp $ */
+/*     $NetBSD: cgfourteen.c,v 1.80 2016/04/30 05:23:03 macallan Exp $ */
 
 /*
  * Copyright (c) 1996
@@ -96,6 +96,7 @@
 #include <dev/rasops/rasops.h>
 
 #include <dev/wscons/wsdisplay_vconsvar.h>
+#include <dev/wscons/wsdisplay_glyphcachevar.h>
 
 #include <sparc/sparc/asm.h>
 #include <sparc/dev/cgfourteenreg.h>
@@ -164,10 +165,9 @@
     uint32_t);
 static void cg14_invert(struct cgfourteen_softc *, int, int, int, int);
 static void cg14_bitblt(void *, int, int, int, int, int, int, int);
+static void cg14_bitblt_gc(void *, int, int, int, int, int, int, int);
 
-#if 0
 static void cg14_putchar_aa(void *, int, int, u_int, long);
-#endif
 static void cg14_cursor(void *, int, int, int);
 static void cg14_putchar(void *, int, int, u_int, long);
 static void cg14_copycols(void *, int, int, int, int);
@@ -595,74 +595,14 @@
 static void
 cg14_init(struct cgfourteen_softc *sc)
 {
-#if 0
-       volatile uint32_t *clut;
-       volatile uint8_t  *xlut;
-       int i;
-
-       /*
-        * We stash away the following to restore on close:
-        *
-        *      color look-up table 1   (sc->sc_saveclut)
-        *      x look-up table         (sc->sc_savexlut)
-        *      control register        (sc->sc_savectl)
-        *      cursor control register (sc->sc_savehwc)
-        */
-       sc->sc_savectl = sc->sc_ctl->ctl_mctl;
-       sc->sc_savehwc = sc->sc_hwc->curs_ctl;
-
-       clut = (volatile uint32_t *) sc->sc_clut1->clut_lut;
-       xlut = (volatile uint8_t *) sc->sc_xlut->xlut_lut;
-       for (i = 0; i < CG14_CLUT_SIZE; i++) {
-               sc->sc_saveclut.cm_chip[i] = clut[i];
-               sc->sc_savexlut[i] = xlut[i];
-       }
-
-       /*
-        * Enable the video and put it in 8 bit mode
-        */
-       sc->sc_ctl->ctl_mctl = CG14_MCTL_ENABLEVID | CG14_MCTL_PIXMODE_8 |
-               CG14_MCTL_POWERCTL;
-#else
        cg14_set_depth(sc, 32);
-#endif
 }
 
 static void
 /* Restore the state saved on cg14_init */
 cg14_reset(struct cgfourteen_softc *sc)
 {
-#if 0
-       volatile uint32_t *clut;
-       volatile uint8_t  *xlut;
-       int i;
-
-       /*
-        * We restore the following, saved in cg14_init:
-        *
-        *      color look-up table 1   (sc->sc_saveclut)
-        *      x look-up table         (sc->sc_savexlut)
-        *      control register        (sc->sc_savectl)
-        *      cursor control register (sc->sc_savehwc)
-        *
-        * Note that we don't touch the video enable bits in the
-        * control register; otherwise, screenblank wouldn't work.
-        */
-       sc->sc_ctl->ctl_mctl = (sc->sc_ctl->ctl_mctl & (CG14_MCTL_ENABLEVID |
-                                                       CG14_MCTL_POWERCTL)) |
-                               (sc->sc_savectl & ~(CG14_MCTL_ENABLEVID |
-                                                   CG14_MCTL_POWERCTL));
-       sc->sc_hwc->curs_ctl = sc->sc_savehwc;
-
-       clut = sc->sc_clut1->clut_lut;
-       xlut = sc->sc_xlut->xlut_lut;
-       for (i = 0; i < CG14_CLUT_SIZE; i++) {
-               clut[i] = sc->sc_saveclut.cm_chip[i];
-               xlut[i] = sc->sc_savexlut[i];
-       }
-#else
        cg14_set_depth(sc, 8);
-#endif
 }
 
 /* Enable/disable video display; power down monitor if DPMS-capable */
@@ -767,7 +707,6 @@
                *lutp++ = *colp++;
 }
 
-#if NWSDISPLAY > 0
 static void
 cg14_setup_wsdisplay(struct cgfourteen_softc *sc, int is_cons)
 {
@@ -793,20 +732,35 @@
 
        ri = &sc->sc_console_screen.scr_ri;
 
+       sc->sc_gc.gc_bitblt = cg14_bitblt_gc;
+       sc->sc_gc.gc_blitcookie = sc;
+       sc->sc_gc.gc_rop = 0xc;
        if (is_cons) {
                vcons_init_screen(&sc->sc_vd, &sc->sc_console_screen, 1,
                    &defattr);
 
                /* clear the screen with the default background colour */
-               memset(sc->sc_fb.fb_pixels,
-                      (defattr >> 16) & 0xff,
-                      ri->ri_stride * ri->ri_height);
+               if (sc->sc_sx != NULL) {
+                       cg14_rectfill(sc, 0, 0, ri->ri_width, ri->ri_height,
+                               ri->ri_devcmap[(defattr >> 16) & 0xf]);
+               } else {
+                       memset(sc->sc_fb.fb_pixels,
+                              ri->ri_devcmap[(defattr >> 16) & 0xf],
+                              ri->ri_stride * ri->ri_height);
+               }
                sc->sc_console_screen.scr_flags |= VCONS_SCREEN_IS_STATIC;
 
                sc->sc_defaultscreen_descr.textops = &ri->ri_ops;
                sc->sc_defaultscreen_descr.capabilities = ri->ri_caps;
                sc->sc_defaultscreen_descr.nrows = ri->ri_rows;
                sc->sc_defaultscreen_descr.ncols = ri->ri_cols;
+               glyphcache_init(&sc->sc_gc, sc->sc_fb.fb_type.fb_height + 5,
+                       (sc->sc_vramsize / sc->sc_fb.fb_type.fb_width) - 
+                        sc->sc_fb.fb_type.fb_height - 5,
+                       sc->sc_fb.fb_type.fb_width,
+                       ri->ri_font->fontwidth,
+                       ri->ri_font->fontheight,
+                       defattr);
                wsdisplay_cnattach(&sc->sc_defaultscreen_descr, ri, 0, 0,
                    defattr);
                vcons_replay_msgbuf(&sc->sc_console_screen);
@@ -815,6 +769,13 @@
                 * since we're not the console we can postpone the rest
                 * until someone actually allocates a screen for us
                 */
+               glyphcache_init(&sc->sc_gc, sc->sc_fb.fb_type.fb_height + 5,
+                       (sc->sc_vramsize / sc->sc_fb.fb_type.fb_width) -
+                        sc->sc_fb.fb_type.fb_height - 5,
+                       sc->sc_fb.fb_type.fb_width,
+                       ri->ri_font->fontwidth,
+                       ri->ri_font->fontheight,
+                       defattr);
        }
 
        cg14_init_cmap(sc);
@@ -830,13 +791,17 @@
 static void
 cg14_init_cmap(struct cgfourteen_softc *sc)
 {
+       struct rasops_info *ri = &sc->sc_console_screen.scr_ri;
        int i, j = 0;
+       uint8_t cmap[768];
+
+       rasops_get_cmap(ri, cmap, sizeof(cmap));
 
        for (i = 0; i < 256; i++) {
 
-               sc->sc_cmap.cm_map[i][3] = rasops_cmap[j];
-               sc->sc_cmap.cm_map[i][2] = rasops_cmap[j + 1];
-               sc->sc_cmap.cm_map[i][1] = rasops_cmap[j + 2];
+               sc->sc_cmap.cm_map[i][3] = cmap[j];
+               sc->sc_cmap.cm_map[i][2] = cmap[j + 1];
+               sc->sc_cmap.cm_map[i][1] = cmap[j + 2];
                j += 3;
        }
        cg14_load_hwcmap(sc, 0, 256);
@@ -1035,6 +1000,8 @@
 
        ri->ri_bits = (char *)sc->sc_fb.fb_pixels;
 #if NSX > 0
+       ri->ri_flg |= RI_8BIT_IS_RGB | RI_ENABLE_ALPHA;
+
        /*
         * unaligned copies with horizontal overlap are slow, so don't bother
         * handling them in cg14_bitblt() and use putchar() instead
@@ -1064,11 +1031,9 @@
                ri->ri_ops.eraserows = cg14_eraserows;
                ri->ri_ops.erasecols = cg14_erasecols;
                ri->ri_ops.cursor = cg14_cursor;
-#if 0
                if (FONT_IS_ALPHA(ri->ri_font)) {
                        ri->ri_ops.putchar = cg14_putchar_aa;
                } else
-#endif
                        ri->ri_ops.putchar = cg14_putchar;
        }
 #endif /* NSX > 0 */
@@ -1403,6 +1368,64 @@
        }
 }
 
+/*
+ * for copying glyphs around
+ * - uses all quads for reads
+ * - uses quads for writes as far as possible
+ * - limited by number of registers - won't do more than 120 wide
+ * - doesn't handle overlaps
+ */
+static void
+cg14_bitblt_gc(void *cookie, int xs, int ys, int xd, int yd,
+    int wi, int he, int rop)
+{
+       struct cgfourteen_softc *sc = cookie;
+       uint32_t saddr, daddr;
+       int line, cnt = wi, stride = sc->sc_fb.fb_type.fb_width;
+       int dreg = 8, swi = wi, dd;
+       int in = 0, q = 0, out = 0, r;
+
+       saddr = sc->sc_fb_paddr + xs + stride * ys;
+       daddr = sc->sc_fb_paddr + xd + stride * yd;
+
+       if (saddr & 3) {
+               swi += saddr & 3;
+               dreg += saddr & 3;
+               saddr &= ~3;
+       }
+       swi = (swi + 3) >> 2;   /* round up, number of quads to read */
+       
+       if (daddr & 3) {
+               in = 4 - (daddr & 3); /* pixels to write in byte mode */
+               cnt -= in;
+       }
+
+       q = cnt >> 2;
+       out = cnt & 3;
+       
+       for (line = 0; line < he; line++) {
+               /* read source line, in all quads */
+               sta(saddr & ~7, ASI_SX, SX_LDUQ0(8, swi - 1, saddr & 7));
+               /* now write it out */
+               dd = daddr;
+               r = dreg;
+               if (in > 0) {
+                       sta(dd & ~7, ASI_SX, SX_STB(r, in - 1, dd & 7));
+                       dd += in;
+                       r += in;
+               }
+               if (q > 0) {
+                       sta(dd & ~7, ASI_SX, SX_STUQ0(r, q - 1, dd & 7));
+                       r += q << 2;
+                       dd += q << 2;
+               }
+               if (out > 0) {
+                       sta(dd & ~7, ASI_SX, SX_STB(r, out - 1, dd & 7));
+               }
+               saddr += stride;
+               daddr += stride;
+       }
+}
 
 static void
 cg14_putchar(void *cookie, int row, int col, u_int c, long attr)
@@ -1506,19 +1529,18 @@
 
 }
 
-#if 0
 static void
-r128fb_putchar_aa(void *cookie, int row, int col, u_int c, long attr)
+cg14_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;
-       uint32_t bg, latch = 0, bg8, fg8, pixel;
-       int i, x, y, wi, he, r, g, b, aval;
-       int r1, g1, b1, r0, g0, b0, fgo, bgo;
+       struct cgfourteen_softc *sc = scr->scr_cookie;
+       int stride = sc->sc_fb.fb_type.fb_width;
+       uint32_t bg, addr, bg8, fg8, pixel, in, q, next;
+       int i, j, x, y, wi, he, r, g, b, aval, cnt, reg;
+       int r1, g1, b1, r0, g0, b0, fgo, bgo, rv;
        uint8_t *data8;
-       int rv, cnt = 0;
 
        if (sc->sc_mode != WSDISPLAYIO_MODE_EMUL) 
                return;
@@ -1533,7 +1555,7 @@
        x = ri->ri_xorigin + col * wi;



Home | Main Index | Thread Index | Old Index