Module Name: src Committed By: macallan Date: Tue Feb 20 11:37:43 UTC 2024
Modified Files: src/sys/arch/hppa/dev: gftfb.c Log Message: enable glyph cache, anti-aliased fonts etc. To generate a diff of this commit: cvs rdiff -u -r1.2 -r1.3 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.2 src/sys/arch/hppa/dev/gftfb.c:1.3 --- src/sys/arch/hppa/dev/gftfb.c:1.2 Thu Feb 15 16:17:32 2024 +++ src/sys/arch/hppa/dev/gftfb.c Tue Feb 20 11:37:43 2024 @@ -1,4 +1,4 @@ -/* $NetBSD: gftfb.c,v 1.2 2024/02/15 16:17:32 macallan Exp $ */ +/* $NetBSD: gftfb.c,v 1.3 2024/02/20 11:37:43 macallan Exp $ */ /* $OpenBSD: sti_pci.c,v 1.7 2009/02/06 22:51:04 miod Exp $ */ @@ -76,6 +76,7 @@ struct gftfb_softc { u_char sc_cmap_red[256]; u_char sc_cmap_green[256]; u_char sc_cmap_blue[256]; + uint32_t sc_reg10; glyphcache sc_gc; }; @@ -90,15 +91,12 @@ void gftfb_enable_rom_internal(struct gf void gftfb_disable_rom_internal(struct gftfb_softc *); void gftfb_setup(struct gftfb_softc *); -void gftfb_wait(struct gftfb_softc *); -void gftfb_wait_fifo(struct gftfb_softc *, uint32_t); #define ngle_bt458_write(memt, memh, r, v) \ bus_space_write_stream_4(memt, memh, NGLE_REG_RAMDAC + ((r) << 2), (v) << 24) -void gftfb_setup_fb(struct gftfb_softc *); -/* XXX these really need o go into their own header */ +/* XXX these really need to go into their own header */ int sti_pci_is_console(struct pci_attach_args *, bus_addr_t *); int sti_rom_setup(struct sti_rom *, bus_space_tag_t, bus_space_tag_t, bus_space_handle_t, bus_addr_t *, u_int); @@ -143,6 +141,31 @@ struct wsdisplay_accessops gftfb_accesso NULL /* scroll */ }; +#define BA(F,C,S,A,J,B,I) \ + (((F)<<31)|((C)<<27)|((S)<<24)|((A)<<21)|((J)<<16)|((B)<<12)|(I)) + +#define IBOvals(R,M,X,S,D,L,B,F) \ + (((R)<<8)|((M)<<16)|((X)<<24)|((S)<<29)|((D)<<28)|((L)<<31)|((B)<<1)|(F)) + +#define IndexedDcd 0 /* Pixel data is indexed (pseudo) color */ +#define Otc04 2 /* Pixels in each longword transfer (4) */ +#define Otc32 5 /* Pixels in each longword transfer (32) */ +#define Ots08 3 /* Each pixel is size (8)d transfer (1) */ +#define OtsIndirect 6 /* Each bit goes through FG/BG color(8) */ +#define AddrLong 5 /* FB address is Long aligned (pixel) */ +#define BINovly 0x2 /* 8 bit overlay */ +#define BINapp0I 0x0 /* Application Buffer 0, Indexed */ +#define BINapp1I 0x1 /* Application Buffer 1, Indexed */ +#define BINapp0F8 0xa /* Application Buffer 0, Fractional 8-8-8 */ +#define BINattr 0xd /* Attribute Bitmap */ +#define RopSrc 0x3 +#define RopInv 0xc +#define BitmapExtent08 3 /* Each write hits ( 8) bits in depth */ +#define BitmapExtent32 5 /* Each write hits (32) bits in depth */ +#define DataDynamic 0 /* Data register reloaded by direct access */ +#define MaskDynamic 1 /* Mask register reloaded by direct access */ +#define MaskOtc 0 /* Mask contains Object Count valid bits */ + int gftfb_match(device_t parent, cfdata_t cf, void *aux) { @@ -165,7 +188,7 @@ gftfb_attach(device_t parent, device_t s struct sti_rom *rom; struct rasops_info *ri; struct wsemuldisplaydev_attach_args aa; - unsigned long defattr; + unsigned long defattr = 0; int ret, is_console = 0, i, j; uint8_t cmap[768]; @@ -230,11 +253,10 @@ gftfb_attach(device_t parent, device_t s ri = &sc->sc_console_screen.scr_ri; -#if 0 sc->sc_gc.gc_bitblt = gftfb_bitblt; sc->sc_gc.gc_blitcookie = sc; - sc->sc_gc.gc_rop = 0x0c; -#endif + sc->sc_gc.gc_rop = RopSrc; + if (is_console) { vcons_init_screen(&sc->vd, &sc->sc_console_screen, 1, &defattr); @@ -244,14 +266,14 @@ gftfb_attach(device_t parent, device_t s sc->sc_defaultscreen_descr.capabilities = ri->ri_caps; sc->sc_defaultscreen_descr.nrows = ri->ri_rows; sc->sc_defaultscreen_descr.ncols = ri->ri_cols; -#if 0 + glyphcache_init(&sc->sc_gc, sc->sc_height + 5, - (0x800000 / sc->sc_stride) - sc->sc_height - 5, + sc->sc_scr.fbheight - sc->sc_height - 5, sc->sc_width, ri->ri_font->fontwidth, ri->ri_font->fontheight, defattr); -#endif + wsdisplay_cnattach(&sc->sc_defaultscreen_descr, ri, 0, 0, defattr); @@ -270,14 +292,13 @@ gftfb_attach(device_t parent, device_t s &defattr); } else (*ri->ri_ops.allocattr)(ri, 0, 0, 0, &defattr); -#if 0 + glyphcache_init(&sc->sc_gc, sc->sc_height + 5, - (0x800000 / sc->sc_stride) - sc->sc_height - 5, + sc->sc_scr.fbheight - sc->sc_height - 5, sc->sc_width, ri->ri_font->fontwidth, ri->ri_font->fontheight, defattr); -#endif } j = 0; @@ -597,7 +618,7 @@ gftfb_disable_rom(struct sti_softc *sc) CLR(sc->sc_flags, STI_ROM_ENABLED); } -void +static inline void gftfb_wait(struct gftfb_softc *sc) { struct sti_rom *rom = sc->sc_base.sc_rom; @@ -612,7 +633,7 @@ gftfb_wait(struct gftfb_softc *sc) } while (stat != 0); } -void +static inline void gftfb_setup_fb(struct gftfb_softc *sc) { struct sti_rom *rom = sc->sc_base.sc_rom; @@ -633,6 +654,8 @@ gftfb_setup(struct gftfb_softc *sc) bus_space_tag_t memt = rom->memt; bus_space_handle_t memh = rom->regh[2]; + sc->sc_reg10 = 0; + /* set Bt458 read mask register to all planes */ gftfb_wait(sc); ngle_bt458_write(memt, memh, 0x08, 0x04); @@ -719,7 +742,7 @@ gftfb_ioctl(void *v, void *vs, u_long cm if(new_mode == WSDISPLAYIO_MODE_EMUL) { gftfb_setup(sc); if (0) gftfb_restore_palette(sc); - //glyphcache_wipe(&sc->sc_gc); + glyphcache_wipe(&sc->sc_gc); gftfb_rectfill(sc, 0, 0, sc->sc_width, sc->sc_height, ms->scr_ri.ri_devcmap[ (ms->scr_defattr >> 16) & 0xff]); @@ -769,15 +792,10 @@ gftfb_init_screen(void *cookie, struct v ri->ri_width = sc->sc_width; ri->ri_height = sc->sc_height; ri->ri_stride = 2048; - ri->ri_flg = RI_CENTER; - if (scr->scr_flags & VCONS_SCREEN_IS_STATIC) - ri->ri_flg |= (RI_FULLCLEAR | RI_CLEAR); + ri->ri_flg = RI_CENTER | RI_8BIT_IS_RGB | + RI_ENABLE_ALPHA | RI_PREFER_ALPHA; + ri->ri_bits = (void *)sc->sc_scr.fbaddr; -#if 0 - if (sc->sc_depth == 8) - ri->ri_flg |= RI_8BIT_IS_RGB | RI_ENABLE_ALPHA | - RI_PREFER_ALPHA; -#endif rasops_init(ri, 0, 0); ri->ri_caps = WSSCREEN_WSCOLORS | WSSCREEN_HILIT | WSSCREEN_UNDERLINE | WSSCREEN_RESIZE; @@ -893,7 +911,7 @@ gftfb_putpalreg(struct gftfb_softc *sc, return 0; } -void +static inline void gftfb_wait_fifo(struct gftfb_softc *sc, uint32_t slots) { struct sti_rom *rom = sc->sc_base.sc_rom; @@ -906,31 +924,6 @@ gftfb_wait_fifo(struct gftfb_softc *sc, } while (reg < slots); } -#define BA(F,C,S,A,J,B,I) \ - (((F)<<31)|((C)<<27)|((S)<<24)|((A)<<21)|((J)<<16)|((B)<<12)|(I)) - -#define IBOvals(R,M,X,S,D,L,B,F) \ - (((R)<<8)|((M)<<16)|((X)<<24)|((S)<<29)|((D)<<28)|((L)<<31)|((B)<<1)|(F)) - -#define IndexedDcd 0 /* Pixel data is indexed (pseudo) color */ -#define Otc04 2 /* Pixels in each longword transfer (4) */ -#define Otc32 5 /* Pixels in each longword transfer (32) */ -#define Ots08 3 /* Each pixel is size (8)d transfer (1) */ -#define OtsIndirect 6 /* Each bit goes through FG/BG color(8) */ -#define AddrLong 5 /* FB address is Long aligned (pixel) */ -#define BINovly 0x2 /* 8 bit overlay */ -#define BINapp0I 0x0 /* Application Buffer 0, Indexed */ -#define BINapp1I 0x1 /* Application Buffer 1, Indexed */ -#define BINapp0F8 0xa /* Application Buffer 0, Fractional 8-8-8 */ -#define BINattr 0xd /* Attribute Bitmap */ -#define RopSrc 0x3 -#define RopInv 0xc -#define BitmapExtent08 3 /* Each write hits ( 8) bits in depth */ -#define BitmapExtent32 5 /* Each write hits (32) bits in depth */ -#define DataDynamic 0 /* Data register reloaded by direct access */ -#define MaskDynamic 1 /* Mask register reloaded by direct access */ -#define MaskOtc 0 /* Mask contains Object Count valid bits */ - static void gftfb_rectfill(struct gftfb_softc *sc, int x, int y, int wi, int he, uint32_t bg) @@ -948,7 +941,7 @@ gftfb_rectfill(struct gftfb_softc *sc, i /* bitmap op */ bus_space_write_stream_4(memt, memh, NGLE_REG_14, IBOvals(RopSrc, 0, BitmapExtent08, 0, DataDynamic, MaskOtc, 0, 0)); - /* dst bitmap acces */ + /* dst bitmap access */ bus_space_write_stream_4(memt, memh, NGLE_REG_11, BA(IndexedDcd, Otc32, OtsIndirect, AddrLong, 0, BINapp0I, 0)); gftfb_wait_fifo(sc, 2); @@ -1020,14 +1013,44 @@ 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; - - if (sc->sc_mode != WSDISPLAYIO_MODE_EMUL) + int x, y, wi, he, rv = GC_NOPE; +#if 0 + uint32_t bg; +#endif + if (sc->sc_mode != WSDISPLAYIO_MODE_EMUL) return; if (!CHAR_IN_FONT(c, font)) return; + + wi = font->fontwidth; + he = font->fontheight; + + x = ri->ri_xorigin + col * wi; + y = ri->ri_yorigin + row * he; +#if 0 + bg = ri->ri_devcmap[(attr >> 16) & 0xf]; + + /* XXX + * rectfill currently draws rectangles less than 32 pixels wide as + * 32 pixels wide, no idea why. So until I figure that one out we + * draw blanks by software + * bitblt doesn't seem to have this problem + */ + if (c == 0x20) { + gftfb_rectfill(sc, x, y, wi, he, bg); + return; + } +#endif + rv = glyphcache_try(&sc->sc_gc, c, x, y, attr); + if (rv == GC_OK) + return; + gftfb_setup_fb(sc); sc->sc_putchar(cookie, row, col, c, attr); + + if (rv == GC_ADD) + glyphcache_add(&sc->sc_gc, c, x, y); } static void