Module Name: src
Committed By: macallan
Date: Mon Jan 6 17:33:28 UTC 2025
Modified Files:
src/sys/arch/hppa/dev: summitfb.c
Log Message:
(ab)use the image buffer as glyph cache, since on this thing we can set source
and destination buffer independently
To generate a diff of this commit:
cvs rdiff -u -r1.26 -r1.27 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.26 src/sys/arch/hppa/dev/summitfb.c:1.27
--- src/sys/arch/hppa/dev/summitfb.c:1.26 Fri Jan 3 13:18:30 2025
+++ src/sys/arch/hppa/dev/summitfb.c Mon Jan 6 17:33:28 2025
@@ -1,4 +1,4 @@
-/* $NetBSD: summitfb.c,v 1.26 2025/01/03 13:18:30 skrll Exp $ */
+/* $NetBSD: summitfb.c,v 1.27 2025/01/06 17:33:28 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.26 2025/01/03 13:18:30 skrll Exp $");
+__KERNEL_RCSID(0, "$NetBSD: summitfb.c,v 1.27 2025/01/06 17:33:28 macallan Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -86,7 +86,7 @@ struct summitfb_softc {
u_char sc_cmap_red[256];
u_char sc_cmap_green[256];
u_char sc_cmap_blue[256];
- uint32_t sc_write_mode;
+ uint32_t sc_write_mode, sc_read_mode;
/* cursor stuff */
int sc_cursor_x, sc_cursor_y;
int sc_hot_x, sc_hot_y, sc_enabled;
@@ -96,10 +96,8 @@ struct summitfb_softc {
int sc_cols; /* chars per line in font area */
int sc_video_on;
-#ifdef SUMMITFB_ENABLE_GC
void (*sc_putchar)(void *, int, int, u_int, long);
glyphcache sc_gc;
-#endif
};
CFATTACH_DECL_NEW(summitfb, sizeof(struct summitfb_softc),
@@ -151,9 +149,7 @@ static void summitfb_cursor(void *, int,
static void summitfb_putchar(void *, int, int, u_int, long);
static void summitfb_putchar_fast(void *, int, int, u_int, long);
static void summitfb_loadfont(struct summitfb_softc *);
-#ifdef SUMMITFB_ENABLE_GC
static void summitfb_putchar_aa(void *, int, int, u_int, long);
-#endif
static void summitfb_copycols(void *, int, int, int, int);
static void summitfb_erasecols(void *, int, int, int, long);
static void summitfb_copyrows(void *, int, int, int);
@@ -270,6 +266,7 @@ summitfb_attach(device_t parent, device_
sc->sc_width = sc->sc_scr.scr_cfg.scr_width;
sc->sc_height = sc->sc_scr.scr_cfg.scr_height;
sc->sc_write_mode = 0xffffffff;
+ sc->sc_read_mode = 0xffffffff;
#ifdef SUMMITFB_DEBUG
sc->sc_height -= 200;
@@ -293,17 +290,13 @@ summitfb_attach(device_t parent, device_
vcons_init(&sc->vd, sc, &sc->sc_defaultscreen_descr,
&summitfb_accessops);
sc->vd.init_screen = summitfb_init_screen;
-#ifdef SUMMITFB_ENABLE_GC
sc->vd.show_screen_cookie = &sc->sc_gc;
sc->vd.show_screen_cb = glyphcache_adapt;
-#endif
ri = &sc->sc_console_screen.scr_ri;
-#ifdef SUMMITFB_ENABLE_GC
sc->sc_gc.gc_bitblt = summitfb_bitblt;
sc->sc_gc.gc_blitcookie = sc;
sc->sc_gc.gc_rop = RopSrc;
-#endif
summitfb_setup(sc);
@@ -324,14 +317,13 @@ summitfb_attach(device_t parent, device_
* FX4 is supposed to support resolutions higher than 1280x1024.
* I guess video memory is allocated in 512x512 chunks
*/
-#ifdef SUMMITFB_ENABLE_GC
- glyphcache_init_x(&sc->sc_gc, sc->sc_width, 0,
+ glyphcache_init(&sc->sc_gc,
+ sc->sc_height,
sc->sc_height,
- 1536 - sc->sc_width - 4,
+ (sc->sc_width + 511) & (~511),
ri->ri_font->fontwidth,
ri->ri_font->fontheight,
defattr);
-#endif
summitfb_restore_palette(sc);
summitfb_rectfill(sc, 0, 0, sc->sc_width, sc->sc_height,
@@ -665,21 +657,32 @@ summitfb_write_mode(struct summitfb_soft
return;
summitfb_wait(sc);
summitfb_write4(sc, VISFX_VRAM_WRITE_MODE, mode);
- summitfb_write4(sc, VISFX_VRAM_READ_MODE,mode & 0x07fff000);
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)
{
summitfb_wait(sc);
if (sc->sc_mode == WSDISPLAYIO_MODE_EMUL) {
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
} 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
}
@@ -721,6 +724,7 @@ summitfb_setup(struct summitfb_softc *sc
summitfb_write4(sc, VISFX_FOE, FOE_BLEND_ROP);
summitfb_write4(sc, VISFX_IBO, RopSrc);
summitfb_write_mode(sc, VISFX_WRITE_MODE_PLAIN);
+ summitfb_read_mode(sc, OTC01 | BIN8F | BUFFL);
summitfb_write4(sc, VISFX_CLIP_TL, 0);
summitfb_write4(sc, VISFX_CLIP_WH,
((sc->sc_scr.fbwidth) << 16) | (sc->sc_scr.fbheight));
@@ -732,10 +736,12 @@ summitfb_setup(struct summitfb_softc *sc
summitfb_write4(sc, VISFX_OTR, OTR_T | OTR_L1 | OTR_L0);
/*
- * initialize XLUT
+ * initialize XLUT, I mean attribute table
+ * set all to 24bit, CFS1
*/
for (i = 0; i < 16; i++)
- summitfb_write4(sc, VISFX_IAA(i), IAA_8F | IAA_CFS1); /* RGB, CFS1 */
+ summitfb_write4(sc, VISFX_IAA(i), IAA_8F | IAA_CFS1);
+ /* RGB8, no LUT */
summitfb_write4(sc, VISFX_CFS(1), CFS_8F | CFS_BYPASS);
/* overlay is 8bit, uses LUT 0 */
summitfb_write4(sc, VISFX_CFS(16), CFS_8I | CFS_LUT0);
@@ -745,7 +751,7 @@ summitfb_setup(struct summitfb_softc *sc
summitfb_write_mode(sc, OTC04 | BINapln);
summitfb_wait_fifo(sc, 4);
summitfb_write4(sc, VISFX_PLANE_MASK, 0xff);
- summitfb_write4(sc, VISFX_IBO, 0);
+ summitfb_write4(sc, VISFX_IBO, 0); /* GXclear */
summitfb_write4(sc, VISFX_START, 0);
summitfb_write4(sc, VISFX_SIZE, (sc->sc_width << 16) | sc->sc_height);
summitfb_wait(sc);
@@ -815,9 +821,7 @@ summitfb_ioctl(void *v, void *vs, u_long
if(new_mode == WSDISPLAYIO_MODE_EMUL) {
summitfb_setup(sc);
summitfb_restore_palette(sc);
-#ifdef SUMMITFB_ENABLE_GC
glyphcache_wipe(&sc->sc_gc);
-#endif
summitfb_loadfont(sc);
summitfb_rectfill(sc, 0, 0, sc->sc_width,
sc->sc_height, ms->scr_ri.ri_devcmap[
@@ -926,16 +930,14 @@ summitfb_init_screen(void *cookie, struc
ri->ri_height = sc->sc_height;
ri->ri_stride = 2048;
ri->ri_flg = RI_CENTER | RI_8BIT_IS_RGB
-#ifdef SUMMITFB_ENABLE_GC
| RI_ENABLE_ALPHA | RI_PREFER_ALPHA
-#endif
;
ri->ri_bits = (void *)sc->sc_scr.fbaddr;
rasops_init(ri, 0, 0);
ri->ri_caps = WSSCREEN_WSCOLORS | WSSCREEN_HILIT | WSSCREEN_UNDERLINE |
WSSCREEN_RESIZE;
- scr->scr_flags |= VCONS_LOADFONT/* | VCONS_NO_CURSOR*/;
+ scr->scr_flags |= VCONS_LOADFONT;
rasops_reconfig(ri, sc->sc_height / ri->ri_font->fontheight,
sc->sc_width / ri->ri_font->fontwidth);
@@ -947,12 +949,11 @@ summitfb_init_screen(void *cookie, struc
ri->ri_ops.eraserows = summitfb_eraserows;
ri->ri_ops.erasecols = summitfb_erasecols;
ri->ri_ops.cursor = summitfb_cursor;
-#ifdef SUMMITFB_ENABLE_GC
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;
} else
-#endif
{
int fbwidth = (sc->sc_width + 511) & ~511;
int fcols = (fbwidth - sc->sc_width - 2) / ri->ri_font->fontwidth;
@@ -1086,8 +1087,20 @@ summitfb_bitblt(void *cookie, int xs, in
int he, int rop)
{
struct summitfb_softc *sc = cookie;
+ uint32_t read_mode, write_mode;
- summitfb_write_mode(sc, VISFX_WRITE_MODE_PLAIN);
+ read_mode = OTC04 | BIN8I;
+ write_mode = OTC04 | BIN8I;
+ if (ys >= sc->sc_height) {
+ read_mode |= BUFBL;
+ ys -= sc->sc_height;
+ }
+ if (yd >= sc->sc_height) {
+ write_mode |= BUFBL;
+ yd -= sc->sc_height;
+ }
+ summitfb_write_mode(sc, write_mode);
+ summitfb_read_mode(sc, read_mode);
summitfb_wait_fifo(sc, 4);
summitfb_write4(sc, VISFX_IBO, rop);
summitfb_write4(sc, VISFX_COPY_SRC, (xs << 16) | ys);
@@ -1220,6 +1233,9 @@ summitfb_loadfont(struct summitfb_softc
uint16_t *data16;
uint32_t mask;
+ if (sc->sc_font == NULL)
+ return;
+
summitfb_write_mode(sc, VISFX_WRITE_MODE_EXPAND);
summitfb_write4(sc, VISFX_IBO, RopSrc);
summitfb_write4(sc, VISFX_FG_COLOUR, 0xffffffff);
@@ -1310,7 +1326,6 @@ summitfb_putchar_fast(void *cookie, int
}
-#ifdef SUMMITFB_ENABLE_GC
static void
summitfb_putchar_aa(void *cookie, int row, int col, u_int c, long attr)
{
@@ -1355,7 +1370,6 @@ summitfb_putchar_aa(void *cookie, int ro
if (rv == GC_ADD)
glyphcache_add(&sc->sc_gc, c, x, y);
}
-#endif
static void
summitfb_copycols(void *cookie, int row, int srccol, int dstcol, int ncols)