Module Name:    src
Committed By:   nat
Date:           Tue Sep  6 02:20:17 UTC 2022

Modified Files:
        src/sys/dev/usb: udl.c udl.h

Log Message:
Finally fix the blitting function.

This means better performance for mostly static displays.
Full screen updates are still done five times a second.

Introduce a new variable sc_clear to force a full update.


To generate a diff of this commit:
cvs rdiff -u -r1.28 -r1.29 src/sys/dev/usb/udl.c
cvs rdiff -u -r1.5 -r1.6 src/sys/dev/usb/udl.h

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/dev/usb/udl.c
diff -u src/sys/dev/usb/udl.c:1.28 src/sys/dev/usb/udl.c:1.29
--- src/sys/dev/usb/udl.c:1.28	Tue May 17 05:05:20 2022
+++ src/sys/dev/usb/udl.c	Tue Sep  6 02:20:17 2022
@@ -1,4 +1,4 @@
-/*	$NetBSD: udl.c,v 1.28 2022/05/17 05:05:20 andvar Exp $	*/
+/*	$NetBSD: udl.c,v 1.29 2022/09/06 02:20:17 nat Exp $	*/
 
 /*-
  * Copyright (c) 2009 FUKAUMI Naoki.
@@ -53,7 +53,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: udl.c,v 1.28 2022/05/17 05:05:20 andvar Exp $");
+__KERNEL_RCSID(0, "$NetBSD: udl.c,v 1.29 2022/09/06 02:20:17 nat Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_usb.h"
@@ -1822,21 +1822,12 @@ static void
 udl_update_thread(void *v)
 {
 	struct udl_softc *sc = v;
-	int stride;
-#ifdef notyet
-	bool update = false;
-	int linecount, x, y;
 	uint16_t *fb, *fbcopy;
-	uint8_t *curfb;
-#else
-	uint16_t *fb;
-	int offs;
-#endif
+	int offs, stride, count = 0;
 
 	mutex_enter(&sc->sc_thread_mtx);
 
 	for (;;) {
-		stride = uimin(sc->sc_width, UDL_CMD_WIDTH_MAX - 8);
 		if (sc->sc_dying == true) {
 			mutex_exit(&sc->sc_thread_mtx);
 			kthread_exit(0);
@@ -1845,49 +1836,25 @@ udl_update_thread(void *v)
 		if (sc->sc_thread_stop == true || sc->sc_fbmem == NULL)
 			goto thread_wait;
 
-#ifdef notyet
-		curfb = kmem_zalloc(UDL_FBMEM_SIZE(sc), KM_SLEEP);
-		memcpy(curfb, sc->sc_fbmem, sc->sc_height * sc->sc_width * 2);
-		fb = (uint16_t *)curfb;
+		if (sc->sc_clear == true)
+			count = 0;
+		sc->sc_clear = false;
+
+		stride = uimin(sc->sc_width, UDL_CMD_WIDTH_MAX - 8);
+		stride /= 8;
+		fb = (uint16_t *)sc->sc_fbmem;
 		fbcopy = (uint16_t *)sc->sc_fbmem_prev;
-		for (y = 0; y < sc->sc_height; y++) {
-			linecount = 0;
-			update = false;
-			for (x = 0; x < sc->sc_width; x++) {
-				if (linecount >= stride) {
-					udl_draw_line(sc, &fb[y * sc->sc_width
-					    + x - linecount], y * sc->sc_width
-					    + x - linecount, linecount);
-					linecount = 0;
-					update = false;
-				}
-				if (fb[y * sc->sc_width + x] ^ fbcopy[y *
-				    sc->sc_width + x]) {
-					update = true;
-					linecount ++;
-				} else if (update == true) {
-					udl_draw_line(sc, &fb[y * sc->sc_width
-					    + x - linecount], y * sc->sc_width
-					    + x - linecount, linecount);
-					linecount = 0;
-					update = false;
-				}
-			}
-			if (linecount) {
-				udl_draw_line(sc, &fb[y * sc->sc_width + x -
-				    linecount], y * sc->sc_width  + x -
-				    linecount, linecount);
+		for (offs = 0; offs < (sc->sc_height * sc->sc_width) - stride;
+		    offs += stride) {
+			if (count % (hz / 5) == 0 || memcmp(&fb[offs],
+			    &fbcopy[offs], stride * sizeof(uint16_t)) != 0) {
+				udl_draw_line(sc, &fb[offs], offs, stride);
+				memcpy(&fbcopy[offs], &fb[offs], stride *
+				   sizeof(uint16_t));
 			}
 		}
-		memcpy(sc->sc_fbmem_prev, curfb, sc->sc_height * sc->sc_width
-		    * 2);
-		kmem_free(curfb, UDL_FBMEM_SIZE(sc));
-#else
-		fb = (uint16_t *)sc->sc_fbmem;
-		for (offs = 0; offs < sc->sc_height * sc->sc_width; offs += stride)
-			udl_draw_line(sc, &fb[offs], offs, stride);
+		count++;
 
-#endif
 
 		kpause("udlslp", false, (40 * hz)/1000 + 1, &sc->sc_thread_mtx);
 		continue;

Index: src/sys/dev/usb/udl.h
diff -u src/sys/dev/usb/udl.h:1.5 src/sys/dev/usb/udl.h:1.6
--- src/sys/dev/usb/udl.h:1.5	Sat Sep 14 15:24:23 2019
+++ src/sys/dev/usb/udl.h	Tue Sep  6 02:20:17 2022
@@ -1,4 +1,4 @@
-/*	$NetBSD: udl.h,v 1.5 2019/09/14 15:24:23 maxv Exp $	*/
+/*	$NetBSD: udl.h,v 1.6 2022/09/06 02:20:17 nat Exp $	*/
 
 /*-
  * Copyright (c) 2009 FUKAUMI Naoki.
@@ -111,6 +111,7 @@ struct udl_softc {
 	device_t		 sc_wsdisplay;
 	u_int			 sc_mode;
 	u_int			 sc_blank;
+	bool			 sc_clear;
 	uint8_t			 sc_nscreens;
 
 	uint8_t			*sc_fbmem;	/* framebuffer for X11 */

Reply via email to