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 */