Module Name:    src
Committed By:   macallan
Date:           Tue Feb 14 08:14:02 UTC 2023

Modified Files:
        src/sys/dev/wscons: wsdisplay_vcons.c

Log Message:
make vcons_putchar_buffer() return a flag indicating if anything actually
changed, skip the actual drawing op if nothing did


To generate a diff of this commit:
cvs rdiff -u -r1.64 -r1.65 src/sys/dev/wscons/wsdisplay_vcons.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/dev/wscons/wsdisplay_vcons.c
diff -u src/sys/dev/wscons/wsdisplay_vcons.c:1.64 src/sys/dev/wscons/wsdisplay_vcons.c:1.65
--- src/sys/dev/wscons/wsdisplay_vcons.c:1.64	Mon Jul 18 11:09:22 2022
+++ src/sys/dev/wscons/wsdisplay_vcons.c	Tue Feb 14 08:14:02 2023
@@ -1,4 +1,4 @@
-/*	$NetBSD: wsdisplay_vcons.c,v 1.64 2022/07/18 11:09:22 martin Exp $ */
+/*	$NetBSD: wsdisplay_vcons.c,v 1.65 2023/02/14 08:14:02 macallan Exp $ */
 
 /*-
  * Copyright (c) 2005, 2006 Michael Lorenz
@@ -27,7 +27,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: wsdisplay_vcons.c,v 1.64 2022/07/18 11:09:22 martin Exp $");
+__KERNEL_RCSID(0, "$NetBSD: wsdisplay_vcons.c,v 1.65 2023/02/14 08:14:02 macallan Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -121,7 +121,7 @@ static void vcons_copycols_buffer(void *
 static void vcons_erasecols_buffer(void *, int, int, int, long);
 static void vcons_copyrows_buffer(void *, int, int, int);
 static void vcons_eraserows_buffer(void *, int, int, long);
-static void vcons_putchar_buffer(void *, int, int, u_int, long);
+static int vcons_putchar_buffer(void *, int, int, u_int, long);
 
 /*
  * actual wrapper methods which call both the _buffer ones above and the
@@ -1237,22 +1237,25 @@ vcons_eraserows(void *cookie, int row, i
 	vcons_unlock(scr);
 }
 
-static void
+static int
 vcons_putchar_buffer(void *cookie, int row, int col, u_int c, long attr)
 {
 	struct rasops_info *ri = cookie;
 	struct vcons_screen *scr = ri->ri_hw;
 	int offset = vcons_offset_to_zero(scr);
-	int pos;
+	int pos, ret = 0;
 
 	if ((row >= 0) && (row < ri->ri_rows) && (col >= 0) &&
 	     (col < ri->ri_cols)) {
 		pos = col + row * ri->ri_cols;
+		ret = (scr->scr_attrs[pos + offset] != attr) ||
+		      (scr->scr_chars[pos + offset] != c);
 		scr->scr_attrs[pos + offset] = attr;
 		scr->scr_chars[pos + offset] = c;
 	}
 
-	vcons_dirty(scr);
+	if (ret) vcons_dirty(scr);
+	return ret;
 }
 
 #ifdef VCONS_DRAW_INTR
@@ -1282,8 +1285,9 @@ vcons_putchar(void *cookie, int row, int
 {
 	struct rasops_info *ri = cookie;
 	struct vcons_screen *scr = ri->ri_hw;
-
-	vcons_putchar_buffer(cookie, row, col, c, attr);
+	int need_draw;
+	
+	need_draw = vcons_putchar_buffer(cookie, row, col, c, attr);
 
 	if (vcons_use_intr(scr))
 		return;
@@ -1291,12 +1295,13 @@ vcons_putchar(void *cookie, int row, int
 	vcons_lock(scr);
 	if (SCREEN_IS_VISIBLE(scr) && SCREEN_CAN_DRAW(scr)) {
 #ifdef VCONS_DRAW_INTR
-		vcons_putchar_cached(cookie, row, col, c, attr);
+		if (need_draw) vcons_putchar_cached(cookie, row, col, c, attr);
 #else
 		if (row == ri->ri_crow && col == ri->ri_ccol) {
 			ri->ri_flg &= ~RI_CURSOR;
-		}
-		scr->putchar(cookie, row, col, c, attr);
+			scr->putchar(cookie, row, col, c, attr);
+		} else if (need_draw)
+			scr->putchar(cookie, row, col, c, attr);
 #endif
 	}
 	vcons_unlock(scr);

Reply via email to