Module Name:    src
Committed By:   rin
Date:           Wed Jul 31 04:45:44 UTC 2019

Modified Files:
        src/sys/dev/rasops: rasops.c rasops.h rasops24.c rasops_putchar_aa.h

Log Message:
Provide buffer capable of single-row pixels in order to make things simpler.

XXX
Bump kernel version for rasops_info later.


To generate a diff of this commit:
cvs rdiff -u -r1.104 -r1.105 src/sys/dev/rasops/rasops.c
cvs rdiff -u -r1.41 -r1.42 src/sys/dev/rasops/rasops.h \
    src/sys/dev/rasops/rasops24.c
cvs rdiff -u -r1.5 -r1.6 src/sys/dev/rasops/rasops_putchar_aa.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/rasops/rasops.c
diff -u src/sys/dev/rasops/rasops.c:1.104 src/sys/dev/rasops/rasops.c:1.105
--- src/sys/dev/rasops/rasops.c:1.104	Wed Jul 31 02:09:02 2019
+++ src/sys/dev/rasops/rasops.c	Wed Jul 31 04:45:44 2019
@@ -1,4 +1,4 @@
-/*	 $NetBSD: rasops.c,v 1.104 2019/07/31 02:09:02 rin Exp $	*/
+/*	 $NetBSD: rasops.c,v 1.105 2019/07/31 04:45:44 rin Exp $	*/
 
 /*-
  * Copyright (c) 1999 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: rasops.c,v 1.104 2019/07/31 02:09:02 rin Exp $");
+__KERNEL_RCSID(0, "$NetBSD: rasops.c,v 1.105 2019/07/31 04:45:44 rin Exp $");
 
 #include "opt_rasops.h"
 #include "rasops_glue.h"
@@ -482,6 +482,14 @@ rasops_reconfig(struct rasops_info *ri, 
 		    WSSCREEN_WSCOLORS | WSSCREEN_REVERSE;
 	}
 
+	if (ri->ri_buf != NULL) {
+		kmem_free(ri->ri_buf, ri->ri_buflen);
+		ri->ri_buf = NULL;
+	}
+	len = (ri->ri_flg & RI_FULLCLEAR) ? ri->ri_stride : ri->ri_emustride;
+	ri->ri_buflen = len;
+	ri->ri_buf = kmem_alloc(len, KM_SLEEP);
+
 #ifndef RASOPS_SMALL
 	if (ri->ri_stamp != NULL) {
 		kmem_free(ri->ri_stamp, ri->ri_stamp_len);
@@ -949,8 +957,9 @@ void
 rasops_eraserows(void *cookie, int row, int num, long attr)
 {
 	struct rasops_info *ri = (struct rasops_info *)cookie;
-	uint32_t *rp, *dp, *hp, clr;
-	int n, cnt;
+	uint32_t *buf = (uint32_t *)ri->ri_buf;
+	uint32_t *rp, *hp, clr;
+	int stride, cnt;
 
 	hp = NULL;	/* XXX GCC */
 
@@ -976,25 +985,26 @@ rasops_eraserows(void *cookie, int row, 
 	 * the RI_FULLCLEAR flag is set, clear the entire display.
 	 */
 	if (num == ri->ri_rows && (ri->ri_flg & RI_FULLCLEAR) != 0) {
-		n = ri->ri_stride >> 2;
+		stride = ri->ri_stride;
 		num = ri->ri_height;
 		rp = (uint32_t *)ri->ri_origbits;
 		if (ri->ri_hwbits)
 			hp = (uint32_t *)ri->ri_hworigbits;
 	} else {
-		n = ri->ri_emustride >> 2;
+		stride = ri->ri_emustride;
 		num *= ri->ri_font->fontheight;
 		rp = (uint32_t *)(ri->ri_bits + row * ri->ri_yscale);
 		if (ri->ri_hwbits)
 			hp = (uint32_t *)(ri->ri_hwbits + row * ri->ri_yscale);
 	}
 
+	for (cnt = 0; cnt < stride >> 2; cnt++)
+		buf[cnt] = clr;
+
 	while (num--) {
-		dp = rp;
-		for (cnt = n; cnt; cnt--)
-			*dp++ = clr;
+		memcpy(rp, buf, stride);
 		if (ri->ri_hwbits) {
-			memcpy(hp, rp, n << 2);
+			memcpy(hp, buf, stride);
 			DELTA(hp, ri->ri_stride, uint32_t *);
 		}
 		DELTA(rp, ri->ri_stride, uint32_t *);
@@ -1114,8 +1124,9 @@ void
 rasops_erasecols(void *cookie, int row, int col, int num, long attr)
 {
 	struct rasops_info *ri = (struct rasops_info *)cookie;
+	void *buf = ri->ri_buf;
 	int height, cnt, slop1, slop2, clr;
-	uint32_t *rp, *dp, *hp;
+	uint32_t *dp, *rp, *hp;
 
 	hp = NULL;	/* XXX GCC */
 
@@ -1143,95 +1154,45 @@ rasops_erasecols(void *cookie, int row, 
 	height = ri->ri_font->fontheight;
 	clr = ri->ri_devcmap[((uint32_t)attr >> 16) & 0xf];
 
-	/* Don't bother using the full loop for <= 32 pels */
-	if (num <= 32) {
-		if (((num | ri->ri_xscale) & 3) == 0) {
-			/* Word aligned blt */
-			num >>= 2;
-
-			while (height--) {
-				dp = rp;
-				for (cnt = num; cnt; cnt--)
-					*dp++ = clr;
-				if (ri->ri_hwbits) {
-					memcpy(hp, rp, num << 2);
-					DELTA(hp, ri->ri_stride, uint32_t *);
-				}
-				DELTA(rp, ri->ri_stride, uint32_t *);
-			}
-		} else if (((num | ri->ri_xscale) & 1) == 0) {
-			/*
-			 * Halfword aligned blt. This is needed so the
-			 * 15/16 bit ops can use this function.
-			 */
-			num >>= 1;
-
-			while (height--) {
-				dp = rp;
-				for (cnt = num; cnt; cnt--) {
-					*(uint16_t *)dp = clr;
-					DELTA(dp, 2, uint32_t *);
-				}
-				if (ri->ri_hwbits) {
-					memcpy(hp, rp, num << 1);
-					DELTA(hp, ri->ri_stride, uint32_t *);
-				}
-				DELTA(rp, ri->ri_stride, uint32_t *);
-			}
-		} else {
-			while (height--) {
-				dp = rp;
-				for (cnt = num; cnt; cnt--) {
-					*(uint8_t *)dp = clr;
-					DELTA(dp, 1, uint32_t *);
-				}
-				if (ri->ri_hwbits) {
-					memcpy(hp, rp, num);
-					DELTA(hp, ri->ri_stride, uint32_t *);
-				}
-				DELTA(rp, ri->ri_stride, uint32_t *);
-			}
-		}
-
-		return;
-	}
+	dp = buf;
 
 	slop1 = (4 - ((uintptr_t)rp & 3)) & 3;
 	slop2 = (num - slop1) & 3;
 	num = (num - slop1 /* - slop2 */) >> 2;
 
-	while (height--) {
-		dp = rp;
+	/* Align span to 4 bytes */
+	if (slop1 & 1) {
+		*(uint8_t *)dp = clr;
+		DELTA(dp, 1, uint32_t *);
+	}
 
-		/* Align span to 4 bytes */
-		if (slop1 & 1) {
-			*(uint8_t *)dp = clr;
-			DELTA(dp, 1, uint32_t *);
-		}
+	if (slop1 & 2) {
+		*(uint16_t *)dp = clr;
+		DELTA(dp, 2, uint32_t *);
+	}
 
-		if (slop1 & 2) {
-			*(uint16_t *)dp = clr;
-			DELTA(dp, 2, uint32_t *);
-		}
+	/* Write 4 bytes per loop */
+	for (cnt = num; cnt; cnt--)
+		*dp++ = clr;
 
-		/* Write 4 bytes per loop */
-		for (cnt = num; cnt; cnt--)
-			*dp++ = clr;
+	/* Write unaligned trailing slop */
+	if (slop2 & 1) {
+		*(uint8_t *)dp = clr;
+		DELTA(dp, 1, uint32_t *);
+	}
 
-		/* Write unaligned trailing slop */
-		if (slop2 & 1) {
-			*(uint8_t *)dp = clr;
-			DELTA(dp, 1, uint32_t *);
-		}
+	if (slop2 & 2)
+		*(uint16_t *)dp = clr;
 
-		if (slop2 & 2)
-			*(uint16_t *)dp = clr;
+	num = slop1 + (num << 2) + slop2;
 
+	while (height--) {
+		memcpy(rp, buf, num);
+		DELTA(rp, ri->ri_stride, uint32_t *);
 		if (ri->ri_hwbits) {
-			memcpy(hp, rp, slop1 + (num << 2) + slop2);
+			memcpy(hp, buf, num);
 			DELTA(hp, ri->ri_stride, uint32_t *);
 		}
-		DELTA(rp, ri->ri_stride, uint32_t *);
 	}
 }
 

Index: src/sys/dev/rasops/rasops.h
diff -u src/sys/dev/rasops/rasops.h:1.41 src/sys/dev/rasops/rasops.h:1.42
--- src/sys/dev/rasops/rasops.h:1.41	Wed Jul 31 02:09:02 2019
+++ src/sys/dev/rasops/rasops.h	Wed Jul 31 04:45:44 2019
@@ -1,4 +1,4 @@
-/* 	$NetBSD: rasops.h,v 1.41 2019/07/31 02:09:02 rin Exp $ */
+/* 	$NetBSD: rasops.h,v 1.42 2019/07/31 04:45:44 rin Exp $ */
 
 /*-
  * Copyright (c) 1999 The NetBSD Foundation, Inc.
@@ -131,6 +131,10 @@ struct rasops_info {
 	/* Callbacks so we can share some code */
 	void	(*ri_do_cursor)(struct rasops_info *);
 
+	/* buffer capable of single-row pixels */
+	void	*ri_buf;
+	size_t	ri_buflen;
+
 	/* 4x1 stamp for optimized character blitting */
 	void	*ri_stamp;
 	long	ri_stamp_attr;
Index: src/sys/dev/rasops/rasops24.c
diff -u src/sys/dev/rasops/rasops24.c:1.41 src/sys/dev/rasops/rasops24.c:1.42
--- src/sys/dev/rasops/rasops24.c:1.41	Wed Jul 31 02:04:14 2019
+++ src/sys/dev/rasops/rasops24.c	Wed Jul 31 04:45:44 2019
@@ -1,4 +1,4 @@
-/* 	$NetBSD: rasops24.c,v 1.41 2019/07/31 02:04:14 rin Exp $	*/
+/* 	$NetBSD: rasops24.c,v 1.42 2019/07/31 04:45:44 rin Exp $	*/
 
 /*-
  * Copyright (c) 1999 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: rasops24.c,v 1.41 2019/07/31 02:04:14 rin Exp $");
+__KERNEL_RCSID(0, "$NetBSD: rasops24.c,v 1.42 2019/07/31 04:45:44 rin Exp $");
 
 #include "opt_rasops.h"
 
@@ -181,7 +181,8 @@ static void
 rasops24_eraserows(void *cookie, int row, int num, long attr)
 {
 	struct rasops_info *ri = (struct rasops_info *)cookie;
-	int n9, n3, n1, cnt, stride;
+	uint32_t *buf = (uint32_t *)ri->ri_buf;
+	int full, slop, cnt, stride;
 	uint32_t *rp, *dp, *hp, clr, stamp[3];
 
 	hp = NULL;	/* XXX GCC */
@@ -243,34 +244,28 @@ rasops24_eraserows(void *cookie, int row
 			hp = (uint32_t *)(ri->ri_hwbits + row * ri->ri_yscale);
 	}
 
-	n9 = stride / (4 * 9);
-	cnt = n9 * (4 * 9);
-	n3 = (stride - cnt) / (4 * 3);
-	cnt += n3 * (4 * 3);
-	n1 = (stride - cnt) / 4;
+	full = stride / (4 * 3);
+	slop = (stride - full * (4 * 3)) / 4;
 
-	while (num--) {
-		dp = rp;
-		for (cnt = n9; cnt; cnt--) {
-			dp[0] = stamp[0]; dp[1] = stamp[1]; dp[2] = stamp[2];
-			dp[3] = stamp[0]; dp[4] = stamp[1]; dp[5] = stamp[2];
-			dp[6] = stamp[0]; dp[7] = stamp[1]; dp[8] = stamp[2];
-			dp += 9;
-		}
+	dp = buf;
 
-		for (cnt = n3; cnt; cnt--) {
-			dp[0] = stamp[0]; dp[1] = stamp[1]; dp[2] = stamp[2];
-			dp += 3;
-		}
+	for (cnt = full; cnt; cnt--) {
+		dp[0] = stamp[0];
+		dp[1] = stamp[1];
+		dp[2] = stamp[2];
+		dp += 3;
+	}
 
-		for (cnt = 0; cnt < n1; cnt++)
-			*dp++ = stamp[cnt];
+	for (cnt = 0; cnt < slop; cnt++)
+		*dp++ = stamp[cnt];
 
+	while (num--) {
+		memcpy(rp, buf, stride);
+		DELTA(rp, ri->ri_stride, uint32_t *);
 		if (ri->ri_hwbits) {
-			memcpy(hp, rp, stride);
+			memcpy(hp, buf, stride);
 			DELTA(hp, ri->ri_stride, uint32_t *);
 		}
-		DELTA(rp, ri->ri_stride, uint32_t *);
 	}
 }
 
@@ -281,7 +276,8 @@ static void
 rasops24_erasecols(void *cookie, int row, int col, int num, long attr)
 {
 	struct rasops_info *ri = (struct rasops_info *)cookie;
-	int n12, n4, height, cnt, slop1, slop2, clr, stamp[3];
+	uint8_t *buf = (uint8_t *)ri->ri_buf;
+	int height, cnt, full, slop1, slop2, clr, stamp[3];
 	uint32_t *dp;
 	uint8_t *rp, *hp, *dbp;
 
@@ -346,52 +342,45 @@ rasops24_erasecols(void *cookie, int row
 	 */
 	slop1 = (uintptr_t)rp & 3;
 	cnt = slop1;
-	n12 = (num - cnt) / 12;
-	cnt += n12 * 12;
-	n4 = (num - cnt) / 4;
-	cnt += n4 * 4;
+	full = (num /* - cnt */) / 4;
+	cnt += full * 4;
 	slop2 = num - cnt;
 
-	while (height--) {
-		dbp = rp;
-
-		/* Align to 4 bytes */
-		/* XXX handle with masks, bring under control of RI_BSWAP */
-		for (cnt = slop1; cnt; cnt--) {
-			*dbp++ = (clr >> 16);
-			*dbp++ = (clr >> 8);
-			*dbp++ =  clr;
-		}
-
-		dp = (uint32_t *)dbp;
-
-		/* 12 pels per loop */
-		for (cnt = n12; cnt; cnt--) {
-			dp[0] = stamp[0]; dp[1] = stamp[1]; dp[2] = stamp[2];
-			dp[3] = stamp[0]; dp[4] = stamp[1]; dp[5] = stamp[2];
-			dp[6] = stamp[0]; dp[7] = stamp[1]; dp[8] = stamp[2];
-			dp += 9;
-		}
-
-		/* 4 pels per loop */
-		for (cnt = n4; cnt; cnt--) {
-			dp[0] = stamp[0]; dp[1] = stamp[1]; dp[2] = stamp[2];
-			dp += 3;
-		}
+	/* Align to 4 bytes */
+	/* XXX handle with masks, bring under control of RI_BSWAP */
+	dbp = buf;
+	for (cnt = slop1; cnt; cnt--) {
+		*dbp++ = (clr >> 16);
+		*dbp++ = (clr >> 8);
+		*dbp++ =  clr;
+	}
+
+	/* 4 pels per loop */
+	dp = (uint32_t *)dbp;
+	for (cnt = full; cnt; cnt--) {
+		dp[0] = stamp[0];
+		dp[1] = stamp[1];
+		dp[2] = stamp[2];
+		dp += 3;
+	}
+
+	/* Trailing slop */
+	/* XXX handle with masks, bring under control of RI_BSWAP */
+	dbp = (uint8_t *)dp;
+	for (cnt = slop2; cnt; cnt--) {
+		*dbp++ = (clr >> 16);
+		*dbp++ = (clr >> 8);
+		*dbp++ =  clr;
+	}
 
-		/* Trailing slop */
-		/* XXX handle with masks, bring under control of RI_BSWAP */
-		dbp = (uint8_t *)dp;
-		for (cnt = slop2; cnt; cnt--) {
-			*dbp++ = (clr >> 16);
-			*dbp++ = (clr >> 8);
-			*dbp++ =  clr;
-		}
+	num *= 3;
 
+	while (height--) {
+		memcpy(rp, buf, num);
+		rp += ri->ri_stride;
 		if (ri->ri_hwbits) {
-			memcpy(hp, rp, num * 3);
+			memcpy(hp, buf, num);
 			hp += ri->ri_stride;
 		}
-		rp += ri->ri_stride;
 	}
 }

Index: src/sys/dev/rasops/rasops_putchar_aa.h
diff -u src/sys/dev/rasops/rasops_putchar_aa.h:1.5 src/sys/dev/rasops/rasops_putchar_aa.h:1.6
--- src/sys/dev/rasops/rasops_putchar_aa.h:1.5	Wed Jul 31 02:26:40 2019
+++ src/sys/dev/rasops/rasops_putchar_aa.h	Wed Jul 31 04:45:44 2019
@@ -1,4 +1,4 @@
-/* $NetBSD: rasops_putchar_aa.h,v 1.5 2019/07/31 02:26:40 rin Exp $ */
+/* $NetBSD: rasops_putchar_aa.h,v 1.6 2019/07/31 04:45:44 rin Exp $ */
 
 /* NetBSD: rasops8.c,v 1.43 2019/07/28 12:06:10 rin Exp */
 /*-
@@ -38,8 +38,6 @@
 #define	PUTCHAR_AA(depth)	PUTCHAR_AA1(depth)
 #define	PUTCHAR_AA1(depth)	rasops ## depth ## _putchar_aa
 
-#define	MAX_WIDTH		64	/* XXX */
-
 #if   RASOPS_DEPTH == 8
 #define	PIXEL_TYPE		uint8_t
 #elif RASOPS_DEPTH == 15
@@ -53,14 +51,12 @@
 #if RASOPS_DEPTH != 24
 #define	COLOR_TYPE		PIXEL_TYPE
 #define	PIXEL_BYTES		sizeof(PIXEL_TYPE)
-#define	BUF_LEN			MAX_WIDTH
 #define	SET_PIXEL(p, x, c)	(p)[x] = clr[c]
 #endif
 
 #if RASOPS_DEPTH == 24
 #define	COLOR_TYPE		uint32_t
 #define	PIXEL_BYTES		3
-#define	BUF_LEN			(MAX_WIDTH * 3)
 #define	SET_PIXEL(p, x, c)			\
 	do {					\
 		(p)[3 * x + 0] = clr[c] >> 16;	\
@@ -80,11 +76,11 @@ PUTCHAR_AA(RASOPS_DEPTH)(void *cookie, i
 {
 	struct rasops_info *ri = (struct rasops_info *)cookie;
 	struct wsdisplay_font *font = PICK_FONT(ri, uc);
+	PIXEL_TYPE *buf = (PIXEL_TYPE *)ri->ri_buf;
 	int height, width, x, y, off[2];
 	uint16_t r[2], g[2], b[2];
 	uint8_t *fr, aval;
 	PIXEL_TYPE *rp, *hp, R, G, B;
-	PIXEL_TYPE buf[BUF_LEN] __attribute__ ((aligned(8))); /* XXX */
 	COLOR_TYPE clr[2];
 
 	hp = NULL;	/* XXX GCC */
@@ -108,11 +104,7 @@ PUTCHAR_AA(RASOPS_DEPTH)(void *cookie, i
 		    col * ri->ri_xscale);
 	
 	height = font->fontheight;
-
-	/* XXX */
 	width = font->fontwidth;
-	if (__predict_false(width > MAX_WIDTH))
-		width = MAX_WIDTH;
 
 	clr[0] = (COLOR_TYPE)ri->ri_devcmap[((uint32_t)attr >> 16) & 0xf];
 	clr[1] = (COLOR_TYPE)ri->ri_devcmap[((uint32_t)attr >> 24) & 0xf];
@@ -208,8 +200,6 @@ PUTCHAR_AA(RASOPS_DEPTH)(void *cookie, i
 #undef	PUTCHAR_AA
 #undef	PUTCHAR_AA1
 
-#undef	MAX_WIDTH
-
 #undef	PIXEL_TYPE
 #undef	COLOR_TYPE
 #undef	PIXEL_BYTES

Reply via email to