Module Name: src Committed By: rin Date: Wed Jul 31 02:04:15 UTC 2019
Modified Files: src/sys/dev/rasops: rasops.c rasops.h rasops15.c rasops2.c rasops24.c rasops32.c rasops4.c rasops8.c rasops_putchar_width.h Log Message: Switch to per-device stamp, and retire stamp_mutex. XXX Bump kernel version after other changes for struct rasops_info. To generate a diff of this commit: cvs rdiff -u -r1.102 -r1.103 src/sys/dev/rasops/rasops.c cvs rdiff -u -r1.39 -r1.40 src/sys/dev/rasops/rasops.h cvs rdiff -u -r1.32 -r1.33 src/sys/dev/rasops/rasops15.c cvs rdiff -u -r1.27 -r1.28 src/sys/dev/rasops/rasops2.c cvs rdiff -u -r1.40 -r1.41 src/sys/dev/rasops/rasops24.c \ src/sys/dev/rasops/rasops32.c cvs rdiff -u -r1.21 -r1.22 src/sys/dev/rasops/rasops4.c cvs rdiff -u -r1.45 -r1.46 src/sys/dev/rasops/rasops8.c cvs rdiff -u -r1.9 -r1.10 src/sys/dev/rasops/rasops_putchar_width.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.102 src/sys/dev/rasops/rasops.c:1.103 --- src/sys/dev/rasops/rasops.c:1.102 Wed Jul 31 00:14:25 2019 +++ src/sys/dev/rasops/rasops.c Wed Jul 31 02:04:14 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: rasops.c,v 1.102 2019/07/31 00:14:25 rin Exp $ */ +/* $NetBSD: rasops.c,v 1.103 2019/07/31 02:04:14 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.102 2019/07/31 00:14:25 rin Exp $"); +__KERNEL_RCSID(0, "$NetBSD: rasops.c,v 1.103 2019/07/31 02:04:14 rin Exp $"); #include "opt_rasops.h" #include "rasops_glue.h" @@ -489,6 +489,13 @@ rasops_reconfig(struct rasops_info *ri, WSSCREEN_WSCOLORS | WSSCREEN_REVERSE; } +#ifndef RASOPS_SMALL + if (ri->ri_stamp != NULL) { + kmem_free(ri->ri_stamp, ri->ri_stamp_len); + ri->ri_stamp = NULL; + } +#endif + switch (ri->ri_depth) { #if NRASOPS1 > 0 case 1: @@ -1670,7 +1677,6 @@ rasops_make_box_chars_alpha(struct rasop * For now this is either a copy of rasops_cmap[] or an R3G3B2 map, it should * probably be a linear ( or gamma corrected? ) ramp for higher depths. */ - int rasops_get_cmap(struct rasops_info *ri, uint8_t *palette, size_t bytes) { @@ -1707,3 +1713,15 @@ rasops_get_cmap(struct rasops_info *ri, memcpy(palette, rasops_cmap, uimin(bytes, sizeof(rasops_cmap))); return 0; } + +#ifndef RASOPS_SMALL +void +rasops_allocstamp(struct rasops_info *ri, size_t len) +{ + + KASSERT(ri->ri_stamp == NULL); + ri->ri_stamp_len = len; + ri->ri_stamp = kmem_zalloc(len, KM_SLEEP); + ri->ri_stamp_attr = 0; +} +#endif Index: src/sys/dev/rasops/rasops.h diff -u src/sys/dev/rasops/rasops.h:1.39 src/sys/dev/rasops/rasops.h:1.40 --- src/sys/dev/rasops/rasops.h:1.39 Wed Jul 31 00:14:25 2019 +++ src/sys/dev/rasops/rasops.h Wed Jul 31 02:04:14 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: rasops.h,v 1.39 2019/07/31 00:14:25 rin Exp $ */ +/* $NetBSD: rasops.h,v 1.40 2019/07/31 02:04:14 rin Exp $ */ /*- * Copyright (c) 1999 The NetBSD Foundation, Inc. @@ -132,6 +132,11 @@ struct rasops_info { /* Callbacks so we can share some code */ void (*ri_do_cursor)(struct rasops_info *); + /* 4x1 stamp for optimized character blitting */ + void *ri_stamp; + long ri_stamp_attr; + size_t ri_stamp_len; + #if NRASOPS_ROTATION > 0 /* Used to intercept putchar to permit display rotation */ struct wsdisplay_emulops ri_real_ops; @@ -182,6 +187,8 @@ void rasops15_init(struct rasops_info *) void rasops24_init(struct rasops_info *); void rasops32_init(struct rasops_info *); +void rasops_allocstamp(struct rasops_info *, size_t); + #define DELTA(p, d, cast) ((p) = (cast)((uint8_t *)(p) + (d))) #define FONT_GLYPH(uc, font, ri) \ Index: src/sys/dev/rasops/rasops15.c diff -u src/sys/dev/rasops/rasops15.c:1.32 src/sys/dev/rasops/rasops15.c:1.33 --- src/sys/dev/rasops/rasops15.c:1.32 Wed Jul 31 00:14:25 2019 +++ src/sys/dev/rasops/rasops15.c Wed Jul 31 02:04:14 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: rasops15.c,v 1.32 2019/07/31 00:14:25 rin Exp $ */ +/* $NetBSD: rasops15.c,v 1.33 2019/07/31 02:04:14 rin Exp $ */ /*- * Copyright (c) 1999 The NetBSD Foundation, Inc. @@ -30,7 +30,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: rasops15.c,v 1.32 2019/07/31 00:14:25 rin Exp $"); +__KERNEL_RCSID(0, "$NetBSD: rasops15.c,v 1.33 2019/07/31 02:04:14 rin Exp $"); #include "opt_rasops.h" @@ -55,13 +55,6 @@ static void rasops15_makestamp(struct ra #ifndef RASOPS_SMALL /* - * 4x1 stamp for optimized character blitting - */ -static uint32_t stamp[32]; -static long stamp_attr; -static int stamp_mutex; /* XXX see note in readme */ - -/* * offset = STAMP_SHIFT(fontbits, nibble #) & STAMP_MASK * destination uint32_t[0] = STAMP_READ(offset) * destination uint32_t[1] = STAMP_READ(offset + 4) @@ -106,8 +99,12 @@ rasops15_init(struct rasops_info *ri) #endif /* !RASOPS_SMALL */ default: ri->ri_ops.putchar = rasops15_putchar; - break; + return; } + +#ifndef RASOPS_SMALL + rasops_allocstamp(ri, sizeof(uint32_t) * 32); +#endif } #define RASOPS_DEPTH 15 @@ -121,12 +118,13 @@ rasops15_init(struct rasops_info *ri) static void rasops15_makestamp(struct rasops_info *ri, long attr) { + uint32_t *stamp = (uint32_t *)ri->ri_stamp; uint32_t fg, bg; int i; fg = ri->ri_devcmap[((uint32_t)attr >> 24) & 0xf] & 0xffff; bg = ri->ri_devcmap[((uint32_t)attr >> 16) & 0xf] & 0xffff; - stamp_attr = attr; + ri->ri_stamp_attr = attr; for (i = 0; i < 32; i += 2) { #if BYTE_ORDER == LITTLE_ENDIAN Index: src/sys/dev/rasops/rasops2.c diff -u src/sys/dev/rasops/rasops2.c:1.27 src/sys/dev/rasops/rasops2.c:1.28 --- src/sys/dev/rasops/rasops2.c:1.27 Wed Jul 31 00:14:25 2019 +++ src/sys/dev/rasops/rasops2.c Wed Jul 31 02:04:14 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: rasops2.c,v 1.27 2019/07/31 00:14:25 rin Exp $ */ +/* $NetBSD: rasops2.c,v 1.28 2019/07/31 02:04:14 rin Exp $ */ /*- * Copyright (c) 1999 The NetBSD Foundation, Inc. @@ -30,7 +30,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: rasops2.c,v 1.27 2019/07/31 00:14:25 rin Exp $"); +__KERNEL_RCSID(0, "$NetBSD: rasops2.c,v 1.28 2019/07/31 02:04:14 rin Exp $"); #include "opt_rasops.h" @@ -55,13 +55,6 @@ static void rasops2_putchar8(void *, int static void rasops2_putchar12(void *, int, int col, u_int, long); static void rasops2_putchar16(void *, int, int col, u_int, long); static void rasops2_makestamp(struct rasops_info *, long); - -/* - * 4x1 stamp for optimized character blitting - */ -static uint8_t stamp[16]; -static long stamp_attr; -static int stamp_mutex; /* XXX see note in README */ #endif /* @@ -79,6 +72,12 @@ void rasops2_init(struct rasops_info *ri) { + if ((ri->ri_font->fontwidth & 3) != 0) { + ri->ri_ops.erasecols = rasops2_erasecols; + ri->ri_ops.copycols = rasops2_copycols; + ri->ri_do_cursor = rasops2_do_cursor; + } + switch (ri->ri_font->fontwidth) { #ifndef RASOPS_SMALL case 8: @@ -94,14 +93,12 @@ rasops2_init(struct rasops_info *ri) default: panic("fontwidth not 8/12/16 or RASOPS_SMALL - fixme!"); ri->ri_ops.putchar = rasops2_putchar; - break; + return; } - if ((ri->ri_font->fontwidth & 3) != 0) { - ri->ri_ops.erasecols = rasops2_erasecols; - ri->ri_ops.copycols = rasops2_copycols; - ri->ri_do_cursor = rasops2_do_cursor; - } +#ifndef RASOPS_SMALL + rasops_allocstamp(ri, sizeof(uint8_t) * 16); +#endif } /* @@ -121,11 +118,12 @@ rasops2_putchar(void *cookie, int row, i static void rasops2_makestamp(struct rasops_info *ri, long attr) { + uint8_t *stamp = (uint8_t *)ri->ri_stamp; int i, fg, bg; fg = ri->ri_devcmap[((uint32_t)attr >> 24) & 0xf] & 3; bg = ri->ri_devcmap[((uint32_t)attr >> 16) & 0xf] & 3; - stamp_attr = attr; + ri->ri_stamp_attr = attr; for (i = 0; i < 16; i++) { #if BYTE_ORDER == BIG_ENDIAN Index: src/sys/dev/rasops/rasops24.c diff -u src/sys/dev/rasops/rasops24.c:1.40 src/sys/dev/rasops/rasops24.c:1.41 --- src/sys/dev/rasops/rasops24.c:1.40 Wed Jul 31 00:14:25 2019 +++ src/sys/dev/rasops/rasops24.c Wed Jul 31 02:04:14 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: rasops24.c,v 1.40 2019/07/31 00:14:25 rin Exp $ */ +/* $NetBSD: rasops24.c,v 1.41 2019/07/31 02:04:14 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.40 2019/07/31 00:14:25 rin Exp $"); +__KERNEL_RCSID(0, "$NetBSD: rasops24.c,v 1.41 2019/07/31 02:04:14 rin Exp $"); #include "opt_rasops.h" @@ -56,13 +56,6 @@ static void rasops24_putchar8(void *, i static void rasops24_putchar12(void *, int, int, u_int, long); static void rasops24_putchar16(void *, int, int, u_int, long); static void rasops24_makestamp(struct rasops_info *, long); - -/* - * 4x1 stamp for optimized character blitting - */ -static uint32_t stamp[64]; -static long stamp_attr; -static int stamp_mutex; /* XXX see note in readme */ #endif /* @@ -82,14 +75,6 @@ void rasops24_init(struct rasops_info *ri) { -#ifndef RASOPS_SMALL - /* - * Different devcmap's are used depending on font widths, - * therefore we need reset stamp here. - */ - stamp_attr = 0; -#endif - if (ri->ri_rnum == 0) { ri->ri_rnum = ri->ri_gnum = ri->ri_bnum = 8; @@ -120,8 +105,12 @@ rasops24_init(struct rasops_info *ri) #endif default: ri->ri_ops.putchar = rasops24_putchar; - break; + return; } + +#ifndef RASOPS_SMALL + rasops_allocstamp(ri, sizeof(uint32_t) * 64); +#endif } #define RASOPS_DEPTH 24 @@ -135,12 +124,13 @@ rasops24_init(struct rasops_info *ri) static void rasops24_makestamp(struct rasops_info *ri, long attr) { + uint32_t *stamp = (uint32_t *)ri->ri_stamp; uint32_t fg, bg, c1, c2, c3, c4; int i; fg = ri->ri_devcmap[((uint32_t)attr >> 24) & 0xf] & 0xffffff; bg = ri->ri_devcmap[((uint32_t)attr >> 16) & 0xf] & 0xffffff; - stamp_attr = attr; + ri->ri_stamp_attr = attr; for (i = 0; i < 64; i += 4) { #if BYTE_ORDER == LITTLE_ENDIAN @@ -192,7 +182,7 @@ rasops24_eraserows(void *cookie, int row { struct rasops_info *ri = (struct rasops_info *)cookie; int n9, n3, n1, cnt, stride; - uint32_t *rp, *dp, *hp, clr, xstamp[3]; + uint32_t *rp, *dp, *hp, clr, stamp[3]; hp = NULL; /* XXX GCC */ @@ -219,18 +209,18 @@ rasops24_eraserows(void *cookie, int row #endif clr = ri->ri_devcmap[((uint32_t)attr >> 16) & 0xf] & 0xffffff; - xstamp[0] = (clr << 8) | (clr >> 16); - xstamp[1] = (clr << 16) | (clr >> 8); - xstamp[2] = (clr << 24) | clr; + stamp[0] = (clr << 8) | (clr >> 16); + stamp[1] = (clr << 16) | (clr >> 8); + stamp[2] = (clr << 24) | clr; #if BYTE_ORDER == LITTLE_ENDIAN if ((ri->ri_flg & RI_BSWAP) == 0) { #else if ((ri->ri_flg & RI_BSWAP) != 0) { #endif - xstamp[0] = bswap32(xstamp[0]); - xstamp[1] = bswap32(xstamp[1]); - xstamp[2] = bswap32(xstamp[2]); + stamp[0] = bswap32(stamp[0]); + stamp[1] = bswap32(stamp[1]); + stamp[2] = bswap32(stamp[2]); } /* @@ -262,19 +252,19 @@ rasops24_eraserows(void *cookie, int row while (num--) { dp = rp; for (cnt = n9; cnt; cnt--) { - dp[0] = xstamp[0]; dp[1] = xstamp[1]; dp[2] = xstamp[2]; - dp[3] = xstamp[0]; dp[4] = xstamp[1]; dp[5] = xstamp[2]; - dp[6] = xstamp[0]; dp[7] = xstamp[1]; dp[8] = xstamp[2]; + 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; } for (cnt = n3; cnt; cnt--) { - dp[0] = xstamp[0]; dp[1] = xstamp[1]; dp[2] = xstamp[2]; + dp[0] = stamp[0]; dp[1] = stamp[1]; dp[2] = stamp[2]; dp += 3; } for (cnt = 0; cnt < n1; cnt++) - *dp++ = xstamp[cnt]; + *dp++ = stamp[cnt]; if (ri->ri_hwbits) { memcpy(hp, rp, stride); @@ -291,7 +281,7 @@ 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, xstamp[3]; + int n12, n4, height, cnt, slop1, slop2, clr, stamp[3]; uint32_t *dp; uint8_t *rp, *hp, *dbp; @@ -331,18 +321,18 @@ rasops24_erasecols(void *cookie, int row height = ri->ri_font->fontheight; clr = ri->ri_devcmap[((uint32_t)attr >> 16) & 0xf] & 0xffffff; - xstamp[0] = (clr << 8) | (clr >> 16); - xstamp[1] = (clr << 16) | (clr >> 8); - xstamp[2] = (clr << 24) | clr; + stamp[0] = (clr << 8) | (clr >> 16); + stamp[1] = (clr << 16) | (clr >> 8); + stamp[2] = (clr << 24) | clr; #if BYTE_ORDER == LITTLE_ENDIAN if ((ri->ri_flg & RI_BSWAP) == 0) { #else if ((ri->ri_flg & RI_BSWAP) != 0) { #endif - xstamp[0] = bswap32(xstamp[0]); - xstamp[1] = bswap32(xstamp[1]); - xstamp[2] = bswap32(xstamp[2]); + stamp[0] = bswap32(stamp[0]); + stamp[1] = bswap32(stamp[1]); + stamp[2] = bswap32(stamp[2]); } /* @@ -377,15 +367,15 @@ rasops24_erasecols(void *cookie, int row /* 12 pels per loop */ for (cnt = n12; cnt; cnt--) { - dp[0] = xstamp[0]; dp[1] = xstamp[1]; dp[2] = xstamp[2]; - dp[3] = xstamp[0]; dp[4] = xstamp[1]; dp[5] = xstamp[2]; - dp[6] = xstamp[0]; dp[7] = xstamp[1]; dp[8] = xstamp[2]; + 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] = xstamp[0]; dp[1] = xstamp[1]; dp[2] = xstamp[2]; + dp[0] = stamp[0]; dp[1] = stamp[1]; dp[2] = stamp[2]; dp += 3; } Index: src/sys/dev/rasops/rasops32.c diff -u src/sys/dev/rasops/rasops32.c:1.40 src/sys/dev/rasops/rasops32.c:1.41 --- src/sys/dev/rasops/rasops32.c:1.40 Wed Jul 31 00:14:25 2019 +++ src/sys/dev/rasops/rasops32.c Wed Jul 31 02:04:14 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: rasops32.c,v 1.40 2019/07/31 00:14:25 rin Exp $ */ +/* $NetBSD: rasops32.c,v 1.41 2019/07/31 02:04:14 rin Exp $ */ /*- * Copyright (c) 1999 The NetBSD Foundation, Inc. @@ -30,7 +30,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: rasops32.c,v 1.40 2019/07/31 00:14:25 rin Exp $"); +__KERNEL_RCSID(0, "$NetBSD: rasops32.c,v 1.41 2019/07/31 02:04:14 rin Exp $"); #include "opt_rasops.h" @@ -51,13 +51,6 @@ static void rasops32_putchar8(void *, in static void rasops32_putchar12(void *, int, int, u_int, long); static void rasops32_putchar16(void *, int, int, u_int, long); static void rasops32_makestamp(struct rasops_info *, long); - -/* - * 4x1 stamp for optimized character blitting - */ -static uint32_t stamp[64]; -static long stamp_attr; -static int stamp_mutex; /* XXX see note in readme */ #endif /* @@ -105,8 +98,12 @@ rasops32_init(struct rasops_info *ri) #endif default: ri->ri_ops.putchar = rasops32_putchar; - break; + return; } + +#ifndef RASOPS_SMALL + rasops_allocstamp(ri, sizeof(uint32_t) * 64); +#endif } #define RASOPS_DEPTH 32 @@ -120,12 +117,13 @@ rasops32_init(struct rasops_info *ri) static void rasops32_makestamp(struct rasops_info *ri, long attr) { + uint32_t *stamp = (uint32_t *)ri->ri_stamp; uint32_t fg, bg; int i; fg = ri->ri_devcmap[((uint32_t)attr >> 24) & 0xf]; bg = ri->ri_devcmap[((uint32_t)attr >> 16) & 0xf]; - stamp_attr = attr; + ri->ri_stamp_attr = attr; for (i = 0; i < 64; i += 4) { stamp[i + 0] = i & 32 ? fg : bg; Index: src/sys/dev/rasops/rasops4.c diff -u src/sys/dev/rasops/rasops4.c:1.21 src/sys/dev/rasops/rasops4.c:1.22 --- src/sys/dev/rasops/rasops4.c:1.21 Wed Jul 31 00:14:25 2019 +++ src/sys/dev/rasops/rasops4.c Wed Jul 31 02:04:14 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: rasops4.c,v 1.21 2019/07/31 00:14:25 rin Exp $ */ +/* $NetBSD: rasops4.c,v 1.22 2019/07/31 02:04:14 rin Exp $ */ /*- * Copyright (c) 1999 The NetBSD Foundation, Inc. @@ -30,7 +30,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: rasops4.c,v 1.21 2019/07/31 00:14:25 rin Exp $"); +__KERNEL_RCSID(0, "$NetBSD: rasops4.c,v 1.22 2019/07/31 02:04:14 rin Exp $"); #include "opt_rasops.h" @@ -55,13 +55,6 @@ static void rasops4_putchar8(void *, int static void rasops4_putchar12(void *, int, int col, u_int, long); static void rasops4_putchar16(void *, int, int col, u_int, long); static void rasops4_makestamp(struct rasops_info *, long); - -/* - * 4x1 stamp for optimized character blitting - */ -static uint16_t stamp[16]; -static long stamp_attr; -static int stamp_mutex; /* XXX see note in README */ #endif /* @@ -100,8 +93,12 @@ rasops4_init(struct rasops_info *ri) default: panic("fontwidth not 8/12/16 or RASOPS_SMALL - fixme!"); ri->ri_ops.putchar = rasops4_putchar; - break; + return; } + +#ifndef RASOPS_SMALL + rasops_allocstamp(ri, sizeof(uint16_t) * 16); +#endif } /* @@ -121,11 +118,12 @@ rasops4_putchar(void *cookie, int row, i static void rasops4_makestamp(struct rasops_info *ri, long attr) { + uint16_t *stamp = (uint16_t *)ri->ri_stamp; int i, fg, bg; fg = ri->ri_devcmap[((uint32_t)attr >> 24) & 0xf] & 0xf; bg = ri->ri_devcmap[((uint32_t)attr >> 16) & 0xf] & 0xf; - stamp_attr = attr; + ri->ri_stamp_attr = attr; for (i = 0; i < 16; i++) { #if BYTE_ORDER == BIG_ENDIAN Index: src/sys/dev/rasops/rasops8.c diff -u src/sys/dev/rasops/rasops8.c:1.45 src/sys/dev/rasops/rasops8.c:1.46 --- src/sys/dev/rasops/rasops8.c:1.45 Wed Jul 31 00:14:25 2019 +++ src/sys/dev/rasops/rasops8.c Wed Jul 31 02:04:14 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: rasops8.c,v 1.45 2019/07/31 00:14:25 rin Exp $ */ +/* $NetBSD: rasops8.c,v 1.46 2019/07/31 02:04:14 rin Exp $ */ /*- * Copyright (c) 1999 The NetBSD Foundation, Inc. @@ -30,7 +30,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: rasops8.c,v 1.45 2019/07/31 00:14:25 rin Exp $"); +__KERNEL_RCSID(0, "$NetBSD: rasops8.c,v 1.46 2019/07/31 02:04:14 rin Exp $"); #include "opt_rasops.h" @@ -51,13 +51,6 @@ static void rasops8_putchar8(void *, in static void rasops8_putchar12(void *, int, int, u_int, long); static void rasops8_putchar16(void *, int, int, u_int, long); static void rasops8_makestamp(struct rasops_info *ri, long); - -/* - * 4x1 stamp for optimized character blitting - */ -static uint32_t stamp[16]; -static long stamp_attr; -static int stamp_mutex; /* XXX see note in README */ #endif /* @@ -103,8 +96,12 @@ rasops8_init(struct rasops_info *ri) #endif /* !RASOPS_SMALL */ default: ri->ri_ops.putchar = rasops8_putchar; - break; + return; } + +#ifndef RASOPS_SMALL + rasops_allocstamp(ri, sizeof(uint32_t) * 16); +#endif } #define RASOPS_DEPTH 8 @@ -118,12 +115,13 @@ rasops8_init(struct rasops_info *ri) static void rasops8_makestamp(struct rasops_info *ri, long attr) { + uint32_t *stamp = (uint32_t *)ri->ri_stamp; uint32_t fg, bg; int i; fg = ri->ri_devcmap[((uint32_t)attr >> 24) & 0xf] & 0xff; bg = ri->ri_devcmap[((uint32_t)attr >> 16) & 0xf] & 0xff; - stamp_attr = attr; + ri->ri_stamp_attr = attr; for (i = 0; i < 16; i++) { #if BYTE_ORDER == BIG_ENDIAN Index: src/sys/dev/rasops/rasops_putchar_width.h diff -u src/sys/dev/rasops/rasops_putchar_width.h:1.9 src/sys/dev/rasops/rasops_putchar_width.h:1.10 --- src/sys/dev/rasops/rasops_putchar_width.h:1.9 Tue Jul 30 15:29:40 2019 +++ src/sys/dev/rasops/rasops_putchar_width.h Wed Jul 31 02:04:14 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: rasops_putchar_width.h,v 1.9 2019/07/30 15:29:40 rin Exp $ */ +/* $NetBSD: rasops_putchar_width.h,v 1.10 2019/07/31 02:04:14 rin Exp $ */ /* NetBSD: rasops8.c,v 1.41 2019/07/25 03:02:44 rin Exp */ /*- @@ -204,9 +204,10 @@ PUTCHAR_WIDTH(RASOPS_DEPTH, RASOPS_WIDTH { struct rasops_info *ri = (struct rasops_info *)cookie; struct wsdisplay_font *font = PICK_FONT(ri, uc); + STAMP_TYPE *stamp = (STAMP_TYPE *)ri->ri_stamp; int height, fs; - STAMP_TYPE *rp, *hp; uint8_t *fr; + STAMP_TYPE *rp, *hp; hp = NULL; /* XXX GCC */ @@ -223,15 +224,8 @@ PUTCHAR_WIDTH(RASOPS_DEPTH, RASOPS_WIDTH if (!CHAR_IN_FONT(uc, font)) return; - /* Can't risk remaking the stamp if it's already in use */ - if (stamp_mutex++) { - stamp_mutex--; - PUTCHAR(RASOPS_DEPTH)(cookie, row, col, uc, attr); - return; - } - /* Recompute stamp? */ - if (attr != stamp_attr) + if (attr != ri->ri_stamp_attr) MAKESTAMP(RASOPS_DEPTH)(ri, attr); rp = (STAMP_TYPE *)(ri->ri_bits + row * ri->ri_yscale + @@ -275,8 +269,6 @@ PUTCHAR_WIDTH(RASOPS_DEPTH, RASOPS_WIDTH memcpy(hp, rp, SUBST_BYTES); } } - - stamp_mutex--; } #undef STAMP_TYPE