Module Name:    src
Committed By:   macallan
Date:           Wed Nov 27 11:11:21 UTC 2024

Modified Files:
        src/sys/arch/hppa/dev: summitfb.c

Log Message:
some cleanup & optimization:
- don't write the pixel mask register for operations that don't use it
- track write mode, only wait if we change it
- always sync when switching in and out of fb mode ( for X... )
- drop sc_hwmode
... about 10% speedup and no more glitches when starting X


To generate a diff of this commit:
cvs rdiff -u -r1.7 -r1.8 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.7 src/sys/arch/hppa/dev/summitfb.c:1.8
--- src/sys/arch/hppa/dev/summitfb.c:1.7	Tue Nov 26 15:49:50 2024
+++ src/sys/arch/hppa/dev/summitfb.c	Wed Nov 27 11:11:21 2024
@@ -1,4 +1,4 @@
-/*	$NetBSD: summitfb.c,v 1.7 2024/11/26 15:49:50 macallan Exp $	*/
+/*	$NetBSD: summitfb.c,v 1.8 2024/11/27 11:11:21 macallan Exp $	*/
 
 /*	$OpenBSD: sti_pci.c,v 1.7 2009/02/06 22:51:04 miod Exp $	*/
 
@@ -26,7 +26,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: summitfb.c,v 1.7 2024/11/26 15:49:50 macallan Exp $");
+__KERNEL_RCSID(0, "$NetBSD: summitfb.c,v 1.8 2024/11/27 11:11:21 macallan Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -84,10 +84,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_hwmode;
-#define HW_FB	0
-#define HW_FILL	1
-#define HW_BLIT	2
+	uint32_t sc_write_mode;
 	/* cursor stuff */
 	int sc_cursor_x, sc_cursor_y;
 	int sc_hot_x, sc_hot_y, sc_enabled;
@@ -168,6 +165,7 @@ struct wsdisplay_accessops summitfb_acce
 };
 
 static inline void summitfb_wait_fifo(struct summitfb_softc *, uint32_t);
+static inline void summitfb_wait(struct summitfb_softc *);
 
 int
 summitfb_match(device_t parent, cfdata_t cf, void *aux)
@@ -248,6 +246,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;
 
 	aprint_normal_dev(sc->sc_dev, "%s at %dx%d\n", sc->sc_scr.name,
 	    sc->sc_width, sc->sc_height);
@@ -320,19 +319,6 @@ summitfb_attach(device_t parent, device_
 	aa.accesscookie = &sc->vd;
 
 	config_found(sc->sc_dev, &aa, wsemuldisplaydevprint, CFARGS_NONE);
-
-#if 0	
-	summitfb_rectfill(sc, 10, 850, 100, 100, 1);
-	summitfb_rectfill(sc, 120, 850, 10, 100, 1);
-	summitfb_rectfill(sc, 200, 840, 1000, 120, 14);
-	summitfb_write4(sc, VISFX_PIXEL_MASK, 0xf0f0cc88);
-	summitfb_bitblt(sc, 0, 845, 205, 845, 150, 110,  0x00000830);
-	//summitfb_bitblt(sc, 0, 845, 405, 845, 150, 110,  0x04000000);
-	summitfb_bitblt(sc, 0, 845, 605, 845, 150, 110,  0x01000000);
-	//summitfb_bitblt(sc, 0, 845, 805, 845, 150, 110,  0x0000020c);
-	//summitfb_bitblt(sc, 0, 845, 1005, 845, 150, 110, 0x04000000);
-	summitfb_write4(sc, VISFX_PIXEL_MASK, 0xffffffff);
-#endif
 }
 
 /*
@@ -637,20 +623,25 @@ 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_setup_fb(struct summitfb_softc *sc)
 {
 
-	sc->sc_hwmode = HW_FB;
-	summitfb_wait(sc);
-	summitfb_write4(sc, VISFX_VRAM_WRITE_MODE, VISFX_WRITE_MODE_PLAIN);
-	summitfb_write4(sc, VISFX_VRAM_READ_MODE, VISFX_READ_MODE_COPY);
+	summitfb_write_mode(sc, VISFX_WRITE_MODE_PLAIN);
 }
 
 void
 summitfb_setup(struct summitfb_softc *sc)
 {
 
-	sc->sc_hwmode = HW_FB;
 	sc->sc_hot_x = 0;
 	sc->sc_hot_y = 0;
 	sc->sc_enabled = 0;
@@ -676,8 +667,11 @@ summitfb_setup(struct summitfb_softc *sc
 	summitfb_write4(sc, 0xa0081c, 0);	/* fx4 */
 #endif
 
+	summitfb_wait(sc);	
 	summitfb_write4(sc, VISFX_PIXEL_MASK, 0xffffffff);
 	summitfb_write4(sc, VISFX_PLANE_MASK, 0xffffffff);
+	summitfb_write_mode(sc, VISFX_WRITE_MODE_PLAIN);
+	summitfb_write4(sc, VISFX_VRAM_READ_MODE, VISFX_READ_MODE_COPY);
 
 	summitfb_setup_fb(sc);
 }
@@ -744,10 +738,10 @@ summitfb_ioctl(void *v, void *vs, u_long
 				summitfb_rectfill(sc, 0, 0, sc->sc_width,
 				    sc->sc_height, ms->scr_ri.ri_devcmap[
 				    (ms->scr_defattr >> 16) & 0xff]);
-				summitfb_setup_fb(sc);
 				vcons_redraw_screen(ms);
 				summitfb_set_video(sc, 1);
 			}
+			summitfb_setup_fb(sc);
 		}
 		return 0;
 	}
@@ -971,11 +965,8 @@ summitfb_rectfill(struct summitfb_softc 
     uint32_t bg)
 {
 
-	summitfb_wait(sc);
-	summitfb_write4(sc, VISFX_VRAM_WRITE_MODE, VISFX_WRITE_MODE_FILL);
-	summitfb_write4(sc, VISFX_PIXEL_MASK, 0xffffffff);
+	summitfb_write_mode(sc, VISFX_WRITE_MODE_FILL);
 	summitfb_write4(sc, VISFX_FG_COLOUR, bg);
-	summitfb_write4(sc, VISFX_BG_COLOUR, bg);
 	summitfb_write4(sc, VISFX_START, (x << 16) | y);
 	summitfb_write4(sc, VISFX_SIZE, (wi << 16) | he);
 }
@@ -987,11 +978,7 @@ summitfb_bitblt(void *cookie, int xs, in
 	struct summitfb_softc *sc = cookie;
 
 	/* XXX no ROP support yet */
-	summitfb_wait(sc);
-	if ((rop == 3) || (rop == 0xc)) rop = 0;
-	summitfb_write4(sc, VISFX_VRAM_WRITE_MODE, VISFX_WRITE_MODE_PLAIN | rop);
-	summitfb_write4(sc, VISFX_VRAM_READ_MODE, VISFX_READ_MODE_COPY);
-	//summitfb_write4(sc, VISFX_PIXEL_MASK, 0xffffffff);
+	summitfb_write_mode(sc, VISFX_WRITE_MODE_PLAIN);
 	summitfb_write4(sc, VISFX_COPY_SRC, (xs << 16) | ys);
 	summitfb_write4(sc, VISFX_COPY_WH, (wi << 16) | he);
 	summitfb_write4(sc, VISFX_COPY_DST, (xd << 16) | yd);
@@ -1092,12 +1079,11 @@ summitfb_putchar(void *cookie, int row, 
 		return;
 #endif
 
-	summitfb_wait(sc);	
+	summitfb_write_mode(sc, VISFX_WRITE_MODE_EXPAND);
 	summitfb_write4(sc, VISFX_FG_COLOUR, fg);
 	summitfb_write4(sc, VISFX_BG_COLOUR, bg);
 	mask = 0xffffffff << (32 - wi);
 	summitfb_write4(sc, VISFX_PIXEL_MASK, mask);
-	summitfb_write4(sc, VISFX_VRAM_WRITE_MODE, VISFX_WRITE_MODE_EXPAND);
 	/* not a tpyo, coordinates *are* backwards for this register */
 	summitfb_write4(sc, VISFX_VRAM_WRITE_DEST, (y << 16) | x);
 
@@ -1161,7 +1147,7 @@ summitfb_putchar_aa(void *cookie, int ro
 	if (rv == GC_OK)
 		return;
 
-	if (sc->sc_hwmode != HW_FB) summitfb_setup_fb(sc);
+	summitfb_setup_fb(sc);
 	sc->sc_putchar(cookie, row, col, c, attr);
 
 	if (rv == GC_ADD)

Reply via email to