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)

Reply via email to