Module Name: src
Committed By: macallan
Date: Mon Jan 27 12:10:19 UTC 2025
Modified Files:
src/sys/arch/hppa/dev: summitfb.c
Log Message:
use hardware to draw anti-aliased characters
To generate a diff of this commit:
cvs rdiff -u -r1.29 -r1.30 src/sys/arch/hppa/dev/summitfb.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/summitfb.c
diff -u src/sys/arch/hppa/dev/summitfb.c:1.29 src/sys/arch/hppa/dev/summitfb.c:1.30
--- src/sys/arch/hppa/dev/summitfb.c:1.29 Sun Jan 26 11:21:21 2025
+++ src/sys/arch/hppa/dev/summitfb.c Mon Jan 27 12:10:19 2025
@@ -1,4 +1,4 @@
-/* $NetBSD: summitfb.c,v 1.29 2025/01/26 11:21:21 macallan Exp $ */
+/* $NetBSD: summitfb.c,v 1.30 2025/01/27 12:10:19 macallan Exp $ */
/* $OpenBSD: sti_pci.c,v 1.7 2009/02/06 22:51:04 miod Exp $ */
@@ -27,7 +27,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: summitfb.c,v 1.29 2025/01/26 11:21:21 macallan Exp $");
+__KERNEL_RCSID(0, "$NetBSD: summitfb.c,v 1.30 2025/01/27 12:10:19 macallan Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -92,9 +92,8 @@ struct summitfb_softc {
struct wsdisplay_font *sc_font;
int sc_font_start; /* x of font area */
int sc_cols; /* chars per line in font area */
-
+ uint32_t sc_palette[16];
int sc_video_on;
- void (*sc_putchar)(void *, int, int, u_int, long);
glyphcache sc_gc;
};
@@ -212,6 +211,26 @@ summitfb_write4(struct summitfb_softc *s
bus_space_write_stream_4(memt, memh, offset - 0x400000, val);
}
+static inline void
+summitfb_write_mode(struct summitfb_softc *sc, uint32_t mode)
+{
+ if (sc->sc_write_mode == mode)
+ return;
+ summitfb_wait(sc);
+ summitfb_write4(sc, VISFX_VRAM_WRITE_MODE, mode);
+ sc->sc_write_mode = mode;
+}
+
+static inline void
+summitfb_read_mode(struct summitfb_softc *sc, uint32_t mode)
+{
+ if (sc->sc_read_mode == mode)
+ return;
+ summitfb_wait(sc);
+ summitfb_write4(sc, VISFX_VRAM_READ_MODE, mode);
+ sc->sc_read_mode = mode;
+}
+
void
summitfb_attach(device_t parent, device_t self, void *aux)
{
@@ -347,6 +366,37 @@ summitfb_attach(device_t parent, device_
aa.accesscookie = &sc->vd;
config_found(sc->sc_dev, &aa, wsemuldisplaydevprint, CFARGS_NONE);
+#ifdef DEBUG
+ {
+ int i;
+
+ summitfb_rectfill(sc, 0, 824, 1280, 200, 0x00);
+ summitfb_rectfill(sc, 5, 830, 100, 190, 0xe0); /* red */
+
+ summitfb_write_mode(sc, OTC01 | BIN332F | BUFovl);
+ summitfb_read_mode(sc, OTC01 | BIN332F | BUFovl);
+ summitfb_write4(sc, VISFX_CBR, 0x3f0000ff);
+ summitfb_write4(sc, VISFX_FG_COLOUR, 0x7f00ff00);
+
+ for (i = 0; i < 16; i++) {
+ summitfb_wait_fifo(sc, 10);
+ summitfb_write4(sc, VISFX_IBO, 0x200 | (14 << 4) | i);
+ summitfb_write4(sc, VISFX_COPY_SRC, (5 << 16) | 830);
+ summitfb_write4(sc, VISFX_COPY_WH, (30 << 16) | 90);
+ summitfb_write4(sc, VISFX_COPY_DST,
+ ((i * 35 + 200) << 16) | 830);
+ }
+ summitfb_write_mode(sc, OTC01 | BIN332F | BUFovl | 0x8c0);
+ summitfb_write4(sc, VISFX_FG_COLOUR, 0x7f00ff00);
+ for (i = 0; i < 16; i++) {
+ summitfb_wait_fifo(sc, 10);
+ summitfb_write4(sc, VISFX_IBO, 0x200 | (i << 4) | 5);
+ summitfb_write4(sc, VISFX_START,
+ ((i * 35 + 200) << 16) | 930);
+ summitfb_write4(sc, VISFX_SIZE, (30 << 16) | 90);
+ }
+ }
+#endif
}
/*
@@ -649,26 +699,6 @@ summitfb_wait(struct summitfb_softc *sc)
}
static inline void
-summitfb_write_mode(struct summitfb_softc *sc, uint32_t mode)
-{
- if (sc->sc_write_mode == mode)
- return;
- summitfb_wait(sc);
- summitfb_write4(sc, VISFX_VRAM_WRITE_MODE, mode);
- sc->sc_write_mode = mode;
-}
-
-static inline void
-summitfb_read_mode(struct summitfb_softc *sc, uint32_t mode)
-{
- if (sc->sc_read_mode == mode)
- return;
- summitfb_wait(sc);
- summitfb_write4(sc, VISFX_VRAM_READ_MODE, mode);
- sc->sc_read_mode = mode;
-}
-
-static inline void
summitfb_setup_fb(struct summitfb_softc *sc)
{
@@ -677,12 +707,14 @@ summitfb_setup_fb(struct summitfb_softc
summitfb_write_mode(sc, VISFX_WRITE_MODE_PLAIN);
summitfb_read_mode(sc, VISFX_WRITE_MODE_PLAIN);
summitfb_write4(sc, VISFX_APERTURE_ACCESS, VISFX_DEPTH_8);
- summitfb_write4(sc, VISFX_OTR, OTR_T | OTR_L1 | OTR_L0); // opaque
+ /* make overlay opaque */
+ summitfb_write4(sc, VISFX_OTR, OTR_T | OTR_L1 | OTR_L0);
} else {
summitfb_write_mode(sc, OTC01 | BIN8F | BUFFL);
summitfb_read_mode(sc, OTC01 | BIN8F | BUFFL);
summitfb_write4(sc, VISFX_APERTURE_ACCESS, VISFX_DEPTH_32);
- summitfb_write4(sc, VISFX_OTR, OTR_A); // all transparent
+ /* make overlay transparent */
+ summitfb_write4(sc, VISFX_OTR, OTR_A);
}
summitfb_write4(sc, VISFX_IBO, RopSrc);
}
@@ -727,7 +759,8 @@ summitfb_setup(struct summitfb_softc *sc
((sc->sc_scr.fbwidth) << 16) | (sc->sc_scr.fbheight));
/* turn off the cursor sprite */
summitfb_write4(sc, VISFX_CURSOR_POS, 0);
- summitfb_write4(sc, VISFX_TCR, 0x10001000); /* disable throttling */
+ /* disable throttling by moving the throttle window way off screen */
+ summitfb_write4(sc, VISFX_TCR, 0x10001000);
/* make sure the overlay is opaque */
summitfb_write4(sc, VISFX_OTR, OTR_T | OTR_L1 | OTR_L0);
@@ -948,7 +981,6 @@ summitfb_init_screen(void *cookie, struc
ri->ri_ops.eraserows = summitfb_eraserows;
ri->ri_ops.erasecols = summitfb_erasecols;
ri->ri_ops.cursor = summitfb_cursor;
- sc->sc_putchar = ri->ri_ops.putchar;
sc->sc_font = NULL;
if (FONT_IS_ALPHA(ri->ri_font)) {
ri->ri_ops.putchar = summitfb_putchar_aa;
@@ -1045,6 +1077,12 @@ summitfb_restore_palette(struct summitfb
summitfb_putpalreg(sc, i, cmap[j], cmap[j + 1], cmap[j + 2]);
j += 3;
}
+ for (i = 0; i < 16; i++) {
+ sc->sc_palette[i] = (rasops_cmap[i * 3] << 16) |
+ (rasops_cmap[i * 3 + 1] << 8) |
+ rasops_cmap[i * 3 + 2];
+ }
+
}
static int
@@ -1345,8 +1383,9 @@ summitfb_putchar_aa(void *cookie, int ro
struct wsdisplay_font *font = PICK_FONT(ri, c);
struct vcons_screen *scr = ri->ri_hw;
struct summitfb_softc *sc = scr->scr_cookie;
- int x, y, wi, he, rv = GC_NOPE;
- uint32_t bg;
+ int x, y, wi, he, rv = GC_NOPE, i, j;
+ uint32_t bg, fg, tmp;
+ uint8_t *data;
if (sc->sc_mode != WSDISPLAYIO_MODE_EMUL)
return;
@@ -1375,9 +1414,49 @@ summitfb_putchar_aa(void *cookie, int ro
if (rv == GC_OK)
return;
- summitfb_setup_fb(sc);
- sc->sc_putchar(cookie, row, col, c, attr);
+ /*
+ * first we clear the background - we should be able to use the CBR
+ * register as constant background but so far I couldn't make that work
+ */
+ summitfb_rectfill(sc, x, y, wi, he, bg);
+
+ /*
+ * if we ever figure out how to use a constant background colour we can
+ * skip the read mode setting
+ */
+ summitfb_read_mode(sc, OTC01 | BIN332F | BUFovl);
+ summitfb_write_mode(sc, OTC01 | BIN332F | BUFovl);
+ /* we need the foreground colour as full RGB8 */
+ fg = sc->sc_palette[(attr >> 24) & 0xf];
+ /*
+ * set the blending equation to
+ * src_color * src_alpha + dst_color * (1 - src_alpha)
+ */
+ summitfb_write4(sc, VISFX_IBO,
+ IBO_ADD | SRC(IBO_SRC) | DST(IBO_ONE_MINUS_SRC));
+
+ /* get the glyph */
+ data = WSFONT_GLYPH(c, font);
+ for (i = 0; i < he; i++) {
+ /*
+ * make some room in the pipeline
+ * with just plain ROPs we can just hammer the FIFO without
+ * having to worry about overflowing it but I suspect with
+ * alpha blending enabled things may be a little slower
+ */
+ summitfb_wait_fifo(sc, wi * 2);
+ /* start a new line */
+ summitfb_write4(sc, VISFX_VRAM_WRITE_DEST, ((y + i) << 16) | x);
+ for (j = 0; j < wi; j++) {
+ tmp = *data;
+ /* alpha & RGB -> ARGB */
+ summitfb_write4(sc, VISFX_VRAM_WRITE_DATA_INCRX,
+ (tmp << 24) | fg);
+ data++;
+ }
+ }
+
if (rv == GC_ADD)
glyphcache_add(&sc->sc_gc, c, x, y);
}