Source-Changes-HG archive

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

[src/trunk]: src/sys/dev/tc Replace sfb_copycols() which can run better job i...



details:   https://anonhg.NetBSD.org/src/rev/cacd9db7daa7
branches:  trunk
changeset: 499639:cacd9db7daa7
user:      nisimura <nisimura%NetBSD.org@localhost>
date:      Sat Nov 25 11:43:42 2000 +0000

description:
Replace sfb_copycols() which can run better job in some degree.
It still fails on certain conditions, thus is left commented out.
copycols() is done by a generic routine which works correctly.

diffstat:

 sys/dev/tc/sfb.c |  180 +++++++++++++++++++++---------------------------------
 1 files changed, 69 insertions(+), 111 deletions(-)

diffs (truncated from 348 to 300 lines):

diff -r 82a7713c3dbe -r cacd9db7daa7 sys/dev/tc/sfb.c
--- a/sys/dev/tc/sfb.c  Sat Nov 25 11:25:07 2000 +0000
+++ b/sys/dev/tc/sfb.c  Sat Nov 25 11:43:42 2000 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: sfb.c,v 1.38 2000/10/27 07:24:04 nisimura Exp $ */
+/* $NetBSD: sfb.c,v 1.39 2000/11/25 11:43:42 nisimura Exp $ */
 
 /*
  * Copyright (c) 1998, 1999 Tohru Nishimura.  All rights reserved.
@@ -32,7 +32,7 @@
 
 #include <sys/cdefs.h>                 /* RCS ID & Copyright macro defns */
 
-__KERNEL_RCSID(0, "$NetBSD: sfb.c,v 1.38 2000/10/27 07:24:04 nisimura Exp $");
+__KERNEL_RCSID(0, "$NetBSD: sfb.c,v 1.39 2000/11/25 11:43:42 nisimura Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -751,7 +751,6 @@
        return (0);
 }
 
-
 static int
 set_cursor(sc, p)
        struct sfb_softc *sc;
@@ -910,7 +909,6 @@
 #define        SFBBG(p, v) \
                (*(u_int32_t *)(BUMP(p) + SFB_ASIC_BG) = (v))
 
-
 #if 0
 /*
  * Paint (or unpaint) the cursor.
@@ -920,28 +918,13 @@
        void *id;
        int on, row, col;
 {
-       struct rasops_info *ri = id;
        caddr_t sfb, p;
        int scanspan, height, width, align, x, y;
        u_int32_t lmask, rmask;
        int fg, bg;
 
-       /* turn the cursor off */
-       if (!on) {
-               /* make sure it's on */
-               if ((rc->rc_bits & RC_CURSOR) == 0)
-                       return;
-
-               row = *rc->rc_crowp;
-               col = *rc->rc_ccolp;
-       } else {
-               /* unpaint the old copy. */
-               *rc->rc_crowp = row;
-               *rc->rc_ccolp = col;
-       }
-
-       x = col * ri->ri_font->fontwidth;
-       y = row * ri->ri_font->fontheight;
+       x = ri->ri_ccol * ri->ri_font->fontwidth;
+       y = ri->ri_crow * ri->ri_font->fontheight;
        scanspan = ri->ri_stride;
        height = ri->ri_font->fontheight;
 
@@ -970,23 +953,30 @@
                        height--;
                }
        }
+#if supportlargerfonts
        else {
                caddr_t q = p;
                while (height > 0) {
                        *(u_int32_t *)p = lmask;
-WRITE_MB();
+                       WRITE_MB();
+                       width -= 2 * SFBSTIPPLEBITS;
+                       while (width > 0) {
+                               p += SFBSTIPPLEBYTESDONE;
+                               *(u_int32_t *)p = SFBSTIPPLEALL1;
+                               WRITE_MB();
+                               width -= SFBSTIPPLEBITS;
+                       }
                        p += SFBSTIPPLEBYTESDONE;
                        *(u_int32_t *)p = rmask;
-WRITE_MB();
-
+                       WRITE_MB();
                        p = (q += scanspan);
+                       width = w + align;
                        height--;
                }
        }
+#endif
        SFBMODE(sfb, MODE_SIMPLE);
        SFBROP(sfb, 3);                 /* ROP_COPY */
-
-       rc->rc_bits ^= RC_CURSOR;
 }
 #endif
 
@@ -1045,19 +1035,15 @@
        }
 #if supportlargerfonts
        else {
+               /*
+                * It's hard to draw oversized glyphs whose width is
+                * larger than 24 pixel.
+                */
                caddr_t q = p;
                while (height > 0) {
-                       glyph = *(u_int16_t *)g;                /* XXX */
-                       SFBPIXELMASK(sfb, lmask);
-WRITE_MB();
-                       *(u_int32_t *)p = glyph << align;
-WRITE_MB();
-                       p += SFBSTIPPLEBYTESDONE;
-                       SFBPIXELMASK(sfb, rmask);
-WRITE_MB();
-                       *(u_int32_t *)p = glyph >> (-width & SFBSTIPPLEBITMASK);
-WRITE_MB();
-
+                       /* XXX */
+                       /* XXX */
+                       /* XXX */
                        p = (q += scanspan);
                        g += 2;                                 /* XXX */
                        height--;
@@ -1080,11 +1066,11 @@
        struct rasops_info *ri = id;
        caddr_t sp, dp, basex, sfb;
        int scanspan, height, width, aligns, alignd, shift, w, y;
-       u_int32_t lmasks, rmasks, lmaskd, rmaskd;
+       u_int32_t lmaskd, rmaskd;
 
        scanspan = ri->ri_stride;
        y = row * ri->ri_font->fontheight;
-       basex = (caddr_t)rap->pixels + y * scanspan;
+       basex = ri->ri_bits + y * scanspan;
        height = ri->ri_font->fontheight;
        w = ri->ri_font->fontwidth * ncols;
 
@@ -1096,55 +1082,56 @@
 
        SFBMODE(sfb, MODE_COPY);
        SFBPLANEMASK(sfb, ~0);
-
+       /* small enough to fit in a single 32bit */
+       if ((aligns + w) <= SFBCOPYBITS && (alignd + w) <= SFBCOPYBITS) {
+               SFBPIXELSHIFT(sfb, alignd - aligns);
+               lmaskd = SFBCOPYALL1 << alignd;
+               rmaskd = SFBCOPYALL1 >> (-(alignd + w) & SFBCOPYBITMASK);
+               lmaskd = lmaskd & rmaskd;
+               sp -= aligns;
+               dp -= alignd;
+               while (height > 0) {
+                       *(u_int32_t *)sp = SFBCOPYALL1; WRITE_MB();
+                       *(u_int32_t *)dp = lmaskd;      WRITE_MB();
+                       sp += scanspan;
+                       dp += scanspan;
+                       height--;
+               }
+       }
        /* copy forward (left-to-right) */
-       if (dstcol < srccol || srccol + ncols < dstcol) {
+       else if (dstcol < srccol || srccol + ncols < dstcol) {
                caddr_t sq, dq;
 
                shift = alignd - aligns;
                if (shift < 0) {
                        shift = 8 + shift;      /* enforce right rotate */
                        alignd += 8;            /* bearing on left edge */
-                       w += 8;                 /* enlarge to left */
                }
-               width = aligns + w;
-
+               width = alignd + w;
+               lmaskd = SFBCOPYALL1 << alignd;
+               rmaskd = SFBCOPYALL1 >> (-width & SFBCOPYBITMASK);
                sp -= aligns;
                dp -= alignd;
-               lmasks = SFBCOPYALL1 << aligns;
-               rmasks = SFBCOPYALL1 >> (-width & SFBCOPYBITMASK);
-               lmaskd = SFBCOPYALL1 << alignd;
-               rmaskd = SFBCOPYALL1 >> (-(w + alignd) & SFBCOPYBITMASK);
-
-               if (w + alignd <= SFBCOPYBITS)
-                       goto singlewrite;
 
                SFBPIXELSHIFT(sfb, shift);
                w = width;
                sq = sp;
                dq = dp;
                while (height > 0) {
-                       *(u_int32_t *)sp = lmasks;
-WRITE_MB();
-                       *(u_int32_t *)dp = lmaskd;
-WRITE_MB();
+                       *(u_int32_t *)sp = SFBCOPYALL1; WRITE_MB();
+                       *(u_int32_t *)dp = lmaskd;      WRITE_MB();
                        width -= 2 * SFBCOPYBITS;
                        while (width > 0) {
                                sp += SFBCOPYBYTESDONE;
                                dp += SFBCOPYBYTESDONE;
-                               *(u_int32_t *)sp = SFBCOPYALL1;
-WRITE_MB();
-                               *(u_int32_t *)dp = SFBCOPYALL1;
-WRITE_MB();
+                               *(u_int32_t *)sp = SFBCOPYALL1; WRITE_MB();
+                               *(u_int32_t *)dp = SFBCOPYALL1; WRITE_MB();
                                width -= SFBCOPYBITS;
                        }
                        sp += SFBCOPYBYTESDONE;
                        dp += SFBCOPYBYTESDONE;
-                       *(u_int32_t *)sp = rmasks;
-WRITE_MB();
-                       *(u_int32_t *)dp = rmaskd;
-WRITE_MB();
-
+                       *(u_int32_t *)sp = SFBCOPYALL1; WRITE_MB();
+                       *(u_int32_t *)dp = rmaskd;      WRITE_MB();
                        sp = (sq += scanspan);
                        dp = (dq += scanspan);
                        width = w;
@@ -1158,45 +1145,33 @@
                shift = alignd - aligns;
                if (shift > 0) {
                        shift = shift - 8;      /* force left rotate */
-                       aligns += 8;            /* flush edge at left end */
+                       alignd += 24;
                }
-               width = aligns + w;
-
+               width = alignd + w;
+               lmaskd = SFBCOPYALL1 << alignd;
+               rmaskd = SFBCOPYALL1 >> (-width & SFBCOPYBITMASK);
                sp -= aligns;
                dp -= alignd;
-               lmasks = SFBCOPYALL1 << aligns;
-               rmasks = SFBCOPYALL1 >> (-width & SFBCOPYBITMASK);
-               lmaskd = SFBCOPYALL1 << alignd;
-               rmaskd = SFBCOPYALL1 >> (-(w + alignd) & SFBCOPYBITMASK);
-
-               if (w + alignd <= SFBCOPYBITS)
-                       goto singlewrite;
 
                SFBPIXELSHIFT(sfb, shift);
                w = width;
-               sq = sp += ((width - 1) & ~31);
-               dq = dp += (((w + alignd) - 1) & ~31);
+               sq = sp += (((aligns + w) - 1) & ~31);
+               dq = dp += (((alignd + w) - 1) & ~31);
                while (height > 0) {
-                       *(u_int32_t *)sp = rmasks;
-WRITE_MB();
-                       *(u_int32_t *)dp = rmaskd;
-WRITE_MB();
+                       *(u_int32_t *)sp = SFBCOPYALL1; WRITE_MB();
+                       *(u_int32_t *)dp = rmaskd;      WRITE_MB();
                        width -= 2 * SFBCOPYBITS;
                        while (width > 0) {
                                sp -= SFBCOPYBYTESDONE;
                                dp -= SFBCOPYBYTESDONE;
-                               *(u_int32_t *)sp = SFBCOPYALL1;
-WRITE_MB();
-                               *(u_int32_t *)dp = SFBCOPYALL1;
-WRITE_MB();
+                               *(u_int32_t *)sp = SFBCOPYALL1; WRITE_MB();
+                               *(u_int32_t *)dp = SFBCOPYALL1; WRITE_MB();
                                width -= SFBCOPYBITS;
                        }
                        sp -= SFBCOPYBYTESDONE;
                        dp -= SFBCOPYBYTESDONE;
-                       *(u_int32_t *)sp = lmasks;
-WRITE_MB();
-                       *(u_int32_t *)dp = lmaskd;
-WRITE_MB();
+                       *(u_int32_t *)sp = SFBCOPYALL1; WRITE_MB();
+                       *(u_int32_t *)dp = lmaskd;      WRITE_MB();
 
                        sp = (sq += scanspan);
                        dp = (dq += scanspan);
@@ -1206,23 +1181,6 @@
        }
        SFBMODE(sfb, MODE_SIMPLE);
        SFBPIXELSHIFT(sfb, 0);
-       return;
-
-singlewrite:
-       SFBPIXELSHIFT(sfb, shift);
-       lmasks = lmasks & rmasks;
-       lmaskd = lmaskd & rmaskd;
-       while (height > 0) {
-               *(u_int32_t *)sp = lmasks;
-WRITE_MB();
-               *(u_int32_t *)dp = lmaskd;
-WRITE_MB();
-               sp += scanspan;
-               dp += scanspan;
-               height--;



Home | Main Index | Thread Index | Old Index