Module Name: src Committed By: macallan Date: Tue Oct 1 07:02:15 UTC 2024
Modified Files: src/sys/arch/hppa/dev: gftfb.c Log Message: use HW to draw bitmap fonts To generate a diff of this commit: cvs rdiff -u -r1.21 -r1.22 src/sys/arch/hppa/dev/gftfb.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/arch/hppa/dev/gftfb.c diff -u src/sys/arch/hppa/dev/gftfb.c:1.21 src/sys/arch/hppa/dev/gftfb.c:1.22 --- src/sys/arch/hppa/dev/gftfb.c:1.21 Mon Sep 30 15:54:42 2024 +++ src/sys/arch/hppa/dev/gftfb.c Tue Oct 1 07:02:14 2024 @@ -1,4 +1,4 @@ -/* $NetBSD: gftfb.c,v 1.21 2024/09/30 15:54:42 macallan Exp $ */ +/* $NetBSD: gftfb.c,v 1.22 2024/10/01 07:02:14 macallan Exp $ */ /* $OpenBSD: sti_pci.c,v 1.7 2009/02/06 22:51:04 miod Exp $ */ @@ -137,6 +137,7 @@ static void gftfb_bitblt(void *, int, in static void gftfb_cursor(void *, int, int, int); static void gftfb_putchar(void *, int, int, u_int, long); +static void gftfb_putchar_aa(void *, int, int, u_int, long); static void gftfb_copycols(void *, int, int, int, int); static void gftfb_erasecols(void *, int, int, int, long); static void gftfb_copyrows(void *, int, int, int); @@ -482,9 +483,7 @@ gftfb_check_rom(struct gftfb_softc *spc, break; #endif default: -#ifdef GFTFB_DEBUG DPRINTF((" (wrong architecture)")); -#endif break; } DPRINTF(("%s\n", selected == offs ? " -> SELECTED" : "")); @@ -943,7 +942,10 @@ gftfb_init_screen(void *cookie, struct v ri->ri_ops.eraserows = gftfb_eraserows; ri->ri_ops.erasecols = gftfb_erasecols; ri->ri_ops.cursor = gftfb_cursor; - ri->ri_ops.putchar = gftfb_putchar; + if (FONT_IS_ALPHA(ri->ri_font)) { + ri->ri_ops.putchar = gftfb_putchar_aa; + } else + ri->ri_ops.putchar = gftfb_putchar; } static int @@ -1162,6 +1164,89 @@ gftfb_putchar(void *cookie, int row, int struct wsdisplay_font *font = PICK_FONT(ri, c); struct vcons_screen *scr = ri->ri_hw; struct gftfb_softc *sc = scr->scr_cookie; + void *data; + int i, x, y, wi, he, rv = GC_NOPE; + uint32_t bg, fg, mask; + + if (sc->sc_mode != WSDISPLAYIO_MODE_EMUL) + return; + + if (!CHAR_IN_FONT(c, font)) + return; + + if (row == ri->ri_crow && col == ri->ri_ccol) { + ri->ri_flg &= ~RI_CURSOR; + } + + wi = font->fontwidth; + he = font->fontheight; + + x = ri->ri_xorigin + col * wi; + y = ri->ri_yorigin + row * he; + + bg = ri->ri_devcmap[(attr >> 16) & 0xf]; + + /* if we're drawing a space we're done here */ + if (c == 0x20) { + gftfb_rectfill(sc, x, y, wi, he, bg); + return; + } + + fg = ri->ri_devcmap[(attr >> 24) & 0x0f]; + + rv = glyphcache_try(&sc->sc_gc, c, x, y, attr); + if (rv == GC_OK) + return; + + /* clear the character cell */ + gftfb_rectfill(sc, x, y, wi, he, bg); + + data = WSFONT_GLYPH(c, font); + + /* + * we're in rectangle mode with transparency enabled from the call to + * gftfb_rectfill() above, so all we need to do is reset the starting + * cordinates, then hammer mask and size/start. Starting coordinates + * will automatically move down the y-axis + */ + gftfb_wait_fifo(sc, 2); + + /* character colour */ + gftfb_write4(sc, NGLE_REG_35, fg); + /* dst XY */ + gftfb_write4(sc, NGLE_REG_6, (x << 16) | y); + + if (ri->ri_font->stride == 1) { + uint8_t *data8 = data; + for (i = 0; i < he; i++) { + gftfb_wait_fifo(sc, 2); + mask = *data8; + gftfb_write4(sc, NGLE_REG_8, mask << 24); + gftfb_write4(sc, NGLE_REG_9, (wi << 16) | 1); + data8++; + } + } else { + uint16_t *data16 = data; + for (i = 0; i < he; i++) { + gftfb_wait_fifo(sc, 2); + mask = *data16; + gftfb_write4(sc, NGLE_REG_8, mask << 16); + gftfb_write4(sc, NGLE_REG_9, (wi << 16) | 1); + data16++; + } + } + + if (rv == GC_ADD) + glyphcache_add(&sc->sc_gc, c, x, y); +} + +static void +gftfb_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 gftfb_softc *sc = scr->scr_cookie; int x, y, wi, he, rv = GC_NOPE; uint32_t bg;