Module Name:    src
Committed By:   macallan
Date:           Wed Jan  4 07:56:35 UTC 2012

Modified Files:
        src/sys/dev/pci: r128fb.c

Log Message:
split putchar into separate methods for bitmap and alpha fonts, use
FONT_IS_ALPHA()


To generate a diff of this commit:
cvs rdiff -u -r1.23 -r1.24 src/sys/dev/pci/r128fb.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/pci/r128fb.c
diff -u src/sys/dev/pci/r128fb.c:1.23 src/sys/dev/pci/r128fb.c:1.24
--- src/sys/dev/pci/r128fb.c:1.23	Wed Dec 28 09:29:03 2011
+++ src/sys/dev/pci/r128fb.c	Wed Jan  4 07:56:35 2012
@@ -1,4 +1,4 @@
-/*	$NetBSD: r128fb.c,v 1.23 2011/12/28 09:29:03 macallan Exp $	*/
+/*	$NetBSD: r128fb.c,v 1.24 2012/01/04 07:56:35 macallan Exp $	*/
 
 /*
  * Copyright (c) 2007 Michael Lorenz
@@ -31,7 +31,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: r128fb.c,v 1.23 2011/12/28 09:29:03 macallan Exp $");
+__KERNEL_RCSID(0, "$NetBSD: r128fb.c,v 1.24 2012/01/04 07:56:35 macallan Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -123,6 +123,7 @@ static void	r128fb_bitblt(struct r128fb_
 
 static void	r128fb_cursor(void *, int, int, int);
 static void	r128fb_putchar(void *, int, int, u_int, long);
+static void	r128fb_putchar_aa(void *, int, int, u_int, long);
 static void	r128fb_copycols(void *, int, int, int, int);
 static void	r128fb_erasecols(void *, int, int, int, long);
 static void	r128fb_copyrows(void *, int, int, int);
@@ -287,11 +288,10 @@ r128fb_attach(device_t parent, device_t 
 	} else {
 		/* steal rasops' ANSI cmap */
 		for (i = 0; i < 256; i++) {
-			sc->sc_cmap_red[i] = rasops_cmap[j];
-			sc->sc_cmap_green[i] = rasops_cmap[j + 1];
-			sc->sc_cmap_blue[i] = rasops_cmap[j + 2];
-			r128fb_putpalreg(sc, i, rasops_cmap[j], rasops_cmap[j + 1],
-			    rasops_cmap[j + 2]);
+			sc->sc_cmap_red[i] = i;
+			sc->sc_cmap_green[i] = i;
+			sc->sc_cmap_blue[i] = i;
+			r128fb_putpalreg(sc, i, i, i, i);
 			j += 3;
 		}
 	}
@@ -534,7 +534,10 @@ r128fb_init_screen(void *cookie, struct 
 	ri->ri_ops.eraserows = r128fb_eraserows;
 	ri->ri_ops.erasecols = r128fb_erasecols;
 	ri->ri_ops.cursor = r128fb_cursor;
-	ri->ri_ops.putchar = r128fb_putchar;
+	if (FONT_IS_ALPHA(ri->ri_font)) {
+		ri->ri_ops.putchar = r128fb_putchar_aa;
+	} else
+		ri->ri_ops.putchar = r128fb_putchar;
 }
 
 static int
@@ -628,15 +631,16 @@ r128fb_putpalreg(struct r128fb_softc *sc
 static void
 r128fb_init(struct r128fb_softc *sc)
 {
-	uint32_t datatype;
+	uint32_t datatype, d, reg;
 
 	r128fb_flush_engine(sc);
 
 	r128fb_wait(sc, 9);
 	bus_space_write_4(sc->sc_memt, sc->sc_regh, R128_CRTC_OFFSET, 0);
 	bus_space_write_4(sc->sc_memt, sc->sc_regh, R128_DEFAULT_OFFSET, 0);
+	/* pitch is in units of 8 pixels */
 	bus_space_write_4(sc->sc_memt, sc->sc_regh, R128_DEFAULT_PITCH,
-	    sc->sc_stride >> 3);
+	    sc->sc_width >> 3);
 	bus_space_write_4(sc->sc_memt, sc->sc_regh, R128_AUX_SC_CNTL, 0);
 	bus_space_write_4(sc->sc_memt, sc->sc_regh,
 	    R128_DEFAULT_SC_BOTTOM_RIGHT,
@@ -648,18 +652,19 @@ r128fb_init(struct r128fb_softc *sc)
 	    R128_DEFAULT_SC_BOTTOM_RIGHT,
 	    R128_DEFAULT_SC_RIGHT_MAX | R128_DEFAULT_SC_BOTTOM_MAX);
 
+#if 0
 #if BYTE_ORDER == BIG_ENDIAN
 	bus_space_write_4(sc->sc_memt, sc->sc_regh, R128_DP_DATATYPE,
 	    R128_HOST_BIG_ENDIAN_EN);
 #else
 	bus_space_write_4(sc->sc_memt, sc->sc_regh, R128_DP_DATATYPE, 0);
 #endif
-
-	r128fb_wait(sc, 5);
+#endif
+	r128fb_wait(sc, 7);
 	bus_space_write_4(sc->sc_memt, sc->sc_regh, R128_SRC_PITCH,
-	    sc->sc_stride >> 3);
+	    sc->sc_width >> 3);
 	bus_space_write_4(sc->sc_memt, sc->sc_regh, R128_DST_PITCH,
-	    sc->sc_stride >> 3);
+	    sc->sc_width >> 3);
 	bus_space_write_4(sc->sc_memt, sc->sc_regh, R128_SRC_OFFSET, 0);
 	bus_space_write_4(sc->sc_memt, sc->sc_regh, R128_DST_OFFSET, 0);
 	bus_space_write_4(sc->sc_memt, sc->sc_regh, R128_DP_WRITE_MASK,
@@ -668,18 +673,23 @@ r128fb_init(struct r128fb_softc *sc)
 	switch (sc->sc_depth) {
 		case 8:
 			datatype = R128_GMC_DST_8BPP_CI;
+			d = R128_CRTC_COLOR_8BIT;
 			break;
 		case 15:
 			datatype = R128_GMC_DST_15BPP;
+			d = R128_CRTC_COLOR_15BIT;
 			break;
 		case 16:
 			datatype = R128_GMC_DST_16BPP;
+			d = R128_CRTC_COLOR_16BIT;
 			break;
 		case 24:
 			datatype = R128_GMC_DST_24BPP;
+			d = R128_CRTC_COLOR_24BIT;
 			break;
 		case 32:
 			datatype = R128_GMC_DST_32BPP;
+			d = R128_CRTC_COLOR_32BIT;
 			break;
 		default:
 			aprint_error("%s: unsupported depth %d\n",
@@ -688,7 +698,12 @@ r128fb_init(struct r128fb_softc *sc)
 	}
 	sc->sc_master_cntl = R128_GMC_CLR_CMP_CNTL_DIS |
 	    R128_GMC_AUX_CLIP_DIS | datatype;
-
+	reg = bus_space_read_4(sc->sc_memt, sc->sc_regh, R128_CRTC_GEN_CNTL);
+	DPRINTF("depth: %d\n", reg & R128_CRTC_PIX_WIDTH);
+	reg &= ~R128_CRTC_PIX_WIDTH;
+	reg |= d;
+	bus_space_write_4(sc->sc_memt, sc->sc_regh, R128_CRTC_GEN_CNTL, reg);
+	bus_space_write_4(sc->sc_memt, sc->sc_regh, R128_CRTC_PITCH, sc->sc_width >> 3);
 	r128fb_flush_engine(sc);
 }
 
@@ -811,6 +826,7 @@ r128fb_putchar(void *cookie, int row, in
 	fg = ri->ri_devcmap[(attr >> 24) & 0xf];
 	x = ri->ri_xorigin + col * wi;
 	y = ri->ri_yorigin + row * he;
+
 	if (c == 0x20) {
 		r128fb_rectfill(sc, x, y, wi, he, bg);
 		return;
@@ -818,158 +834,175 @@ r128fb_putchar(void *cookie, int row, in
 
 	uc = c - font->firstchar;
 	data = (uint8_t *)font->data + uc * ri->ri_fontscale;
-	if (font->stride < wi) {
-		/* this is a mono bitmap font */
 
-		r128fb_wait(sc, 8);
+	r128fb_wait(sc, 8);
 
-		bus_space_write_4(sc->sc_memt, sc->sc_regh, 
-		    R128_DP_GUI_MASTER_CNTL,
-		    R128_GMC_BRUSH_SOLID_COLOR |
-		    R128_GMC_SRC_DATATYPE_MONO_FG_BG |
-		    R128_ROP3_S |
-		    R128_DP_SRC_SOURCE_HOST_DATA |
-		    R128_GMC_DST_CLIPPING |
-		    sc->sc_master_cntl);
-
-		bus_space_write_4(sc->sc_memt, sc->sc_regh, 
-		    R128_DP_CNTL, 
-		    R128_DST_Y_TOP_TO_BOTTOM | 
-		    R128_DST_X_LEFT_TO_RIGHT);
-
-		bus_space_write_4(sc->sc_memt, sc->sc_regh, 
-		    R128_DP_SRC_FRGD_CLR, fg);
-		bus_space_write_4(sc->sc_memt, sc->sc_regh, 
-		    R128_DP_SRC_BKGD_CLR, bg);
+	bus_space_write_4(sc->sc_memt, sc->sc_regh, 
+	    R128_DP_GUI_MASTER_CNTL,
+	    R128_GMC_BRUSH_SOLID_COLOR |
+	    R128_GMC_SRC_DATATYPE_MONO_FG_BG |
+	    R128_ROP3_S |
+	    R128_DP_SRC_SOURCE_HOST_DATA |
+	    R128_GMC_DST_CLIPPING |
+	    sc->sc_master_cntl);
 
-		/*
-		 * The Rage 128 doesn't have anything to skip pixels
-		 * when colour expanding but all coordinates
-		 * are signed so we just clip the leading bytes and 
-		 * trailing bits away
-		 */
-		bus_space_write_4(sc->sc_memt, sc->sc_regh, 
-		    R128_SC_RIGHT, x + wi - 1);
-		bus_space_write_4(sc->sc_memt, sc->sc_regh, 
-		    R128_SC_LEFT, x);
-
-		/* needed? */
-		bus_space_write_4(sc->sc_memt, sc->sc_regh, R128_SRC_X_Y, 0);
-
-		offset = 32 - (ri->ri_font->stride << 3);
-		bus_space_write_4(sc->sc_memt, sc->sc_regh, R128_DST_X_Y,
-		    ((x - offset) << 16) | y);
-		bus_space_write_4(sc->sc_memt, sc->sc_regh,
-		    R128_DST_WIDTH_HEIGHT, (32 << 16) | he);
-
-		r128fb_wait(sc, he);
-		switch (ri->ri_font->stride) {
-			case 1: {
-				uint8_t *data8 = data;
-				uint32_t reg;
-				for (i = 0; i < he; i++) {
-					reg = *data8;
-					bus_space_write_stream_4(sc->sc_memt, 
-					    sc->sc_regh,
-					    R128_HOST_DATA0, reg);
-					data8++;
-				}
-				break;
+	bus_space_write_4(sc->sc_memt, sc->sc_regh, 
+	    R128_DP_CNTL, 
+	    R128_DST_Y_TOP_TO_BOTTOM | 
+	    R128_DST_X_LEFT_TO_RIGHT);
+
+	bus_space_write_4(sc->sc_memt, sc->sc_regh, 
+	    R128_DP_SRC_FRGD_CLR, fg);
+	bus_space_write_4(sc->sc_memt, sc->sc_regh, 
+	    R128_DP_SRC_BKGD_CLR, bg);
+
+	/*
+	 * The Rage 128 doesn't have anything to skip pixels
+	 * when colour expanding but all coordinates
+	 * are signed so we just clip the leading bytes and 
+	 * trailing bits away
+	 */
+	bus_space_write_4(sc->sc_memt, sc->sc_regh, 
+	    R128_SC_RIGHT, x + wi - 1);
+	bus_space_write_4(sc->sc_memt, sc->sc_regh, 
+	    R128_SC_LEFT, x);
+
+	/* needed? */
+	bus_space_write_4(sc->sc_memt, sc->sc_regh, R128_SRC_X_Y, 0);
+
+	offset = 32 - (font->stride << 3);
+	bus_space_write_4(sc->sc_memt, sc->sc_regh, R128_DST_X_Y,
+	    ((x - offset) << 16) | y);
+	bus_space_write_4(sc->sc_memt, sc->sc_regh,
+	    R128_DST_WIDTH_HEIGHT, (32 << 16) | he);
+
+	r128fb_wait(sc, he);
+	switch (font->stride) {
+		case 1: {
+			uint8_t *data8 = data;
+			uint32_t reg;
+			for (i = 0; i < he; i++) {
+				reg = *data8;
+				bus_space_write_stream_4(sc->sc_memt, 
+				    sc->sc_regh, R128_HOST_DATA0, reg);
+				data8++;
 			}
-			case 2: {
-				uint16_t *data16 = data;
-				uint32_t reg;
-				for (i = 0; i < he; i++) {
-					reg = *data16;
-					bus_space_write_stream_4(sc->sc_memt, 
-					    sc->sc_regh,
-					    R128_HOST_DATA0, reg);
-					data16++;
-				}
-				break;
+			break;
+		}
+		case 2: {
+			uint16_t *data16 = data;
+			uint32_t reg;
+			for (i = 0; i < he; i++) {
+				reg = *data16;
+				bus_space_write_stream_4(sc->sc_memt, 
+				    sc->sc_regh, R128_HOST_DATA0, reg);
+				data16++;
 			}
+			break;
 		}
-	} else {
-		/*
-		 * this is an alpha font
-		 * for now we only support this in 8 bit r3g3b2 colour
-		 */
-		uint32_t latch = 0, bg8, fg8, pixel;
-		int r, g, b, aval;
-		int r1, g1, b1, r0, g0, b0, fgo, bgo;
-		uint8_t *data8 = data;
-
-		r128fb_wait(sc, 5);
-		bus_space_write_4(sc->sc_memt, sc->sc_regh, 
-		    R128_DP_GUI_MASTER_CNTL,
-		    R128_GMC_BRUSH_SOLID_COLOR |
-		    R128_GMC_SRC_DATATYPE_COLOR |
-		    R128_ROP3_S |
-		    R128_DP_SRC_SOURCE_HOST_DATA |
-		    sc->sc_master_cntl);
-
-		bus_space_write_4(sc->sc_memt, sc->sc_regh, 
-		    R128_DP_CNTL, 
-		    R128_DST_Y_TOP_TO_BOTTOM | 
-		    R128_DST_X_LEFT_TO_RIGHT);
-
-		/* needed? */
-		bus_space_write_4(sc->sc_memt, sc->sc_regh, 
-		    R128_SRC_X_Y, 0);
-		bus_space_write_4(sc->sc_memt, sc->sc_regh, 
-		    R128_DST_X_Y, (x << 16) | y);
-		bus_space_write_4(sc->sc_memt, sc->sc_regh, 
-		    R128_DST_WIDTH_HEIGHT, (wi << 16) | he);
+	}
+}
 
-		/*
-		 * we need the RGB colours here, so get offsets into
-		 * rasops_cmap
-		 */
-		fgo = ((attr >> 24) & 0xf) * 3;
-		bgo = ((attr >> 16) & 0xf) * 3;
+static void
+r128fb_putchar_aa(void *cookie, int row, int col, u_int c, long attr)
+{
+	struct rasops_info *ri = cookie;
+	struct wsdisplay_font *font = PICK_FONT(ri, c);
+	struct vcons_screen *scr = ri->ri_hw;
+	struct r128fb_softc *sc = scr->scr_cookie;
+	uint32_t bg, latch = 0, bg8, fg8, pixel;
+	int uc, i, x, y, wi, he, r, g, b, aval;
+	int r1, g1, b1, r0, g0, b0, fgo, bgo;
+	uint8_t *data8;
+
+	if (sc->sc_mode != WSDISPLAYIO_MODE_EMUL) 
+		return;
+
+	if (!CHAR_IN_FONT(c, font))
+		return;
+
+	wi = font->fontwidth;
+	he = font->fontheight;
+
+	bg = ri->ri_devcmap[(attr >> 16) & 0xf];
+	x = ri->ri_xorigin + col * wi;
+	y = ri->ri_yorigin + row * he;
+	if (c == 0x20) {
+		r128fb_rectfill(sc, x, y, wi, he, bg);
+		return;
+	}
 
-		r0 = rasops_cmap[bgo];
-		r1 = rasops_cmap[fgo];
-		g0 = rasops_cmap[bgo + 1];
-		g1 = rasops_cmap[fgo + 1];
-		b0 = rasops_cmap[bgo + 2];
-		b1 = rasops_cmap[fgo + 2];
+	uc = c - font->firstchar;
+	data8 = (uint8_t *)font->data + uc * ri->ri_fontscale;
+
+	r128fb_wait(sc, 5);
+	bus_space_write_4(sc->sc_memt, sc->sc_regh, 
+	    R128_DP_GUI_MASTER_CNTL,
+	    R128_GMC_BRUSH_SOLID_COLOR |
+	    R128_GMC_SRC_DATATYPE_COLOR |
+	    R128_ROP3_S |
+	    R128_DP_SRC_SOURCE_HOST_DATA |
+	    sc->sc_master_cntl);
+
+	bus_space_write_4(sc->sc_memt, sc->sc_regh, 
+	    R128_DP_CNTL, 
+	    R128_DST_Y_TOP_TO_BOTTOM | 
+	    R128_DST_X_LEFT_TO_RIGHT);
+
+	/* needed? */
+	bus_space_write_4(sc->sc_memt, sc->sc_regh, R128_SRC_X_Y, 0);
+	bus_space_write_4(sc->sc_memt, sc->sc_regh, R128_DST_X_Y,
+	    (x << 16) | y);
+	bus_space_write_4(sc->sc_memt, sc->sc_regh, R128_DST_WIDTH_HEIGHT,
+	    (wi << 16) | he);
+
+	/*
+	 * we need the RGB colours here, so get offsets into rasops_cmap
+	 */
+	fgo = ((attr >> 24) & 0xf) * 3;
+	bgo = ((attr >> 16) & 0xf) * 3;
+
+	r0 = rasops_cmap[bgo];
+	r1 = rasops_cmap[fgo];
+	g0 = rasops_cmap[bgo + 1];
+	g1 = rasops_cmap[fgo + 1];
+	b0 = rasops_cmap[bgo + 2];
+	b1 = rasops_cmap[fgo + 2];
 #define R3G3B2(r, g, b) ((r & 0xe0) | ((g >> 3) & 0x1c) | (b >> 6))
-		bg8 = R3G3B2(r0, g0, b0);
-		fg8 = R3G3B2(r1, g1, b1);
-		for (i = 0; i < ri->ri_fontscale; i++) {
-			aval = *data8;
-			if (aval == 0) {
-				pixel = bg8;
-			} else if (aval == 255) {
-				pixel = fg8;
-			} else {
-				r = aval * r1 + (255 - aval) * r0;
-				g = aval * g1 + (255 - aval) * g0;
-				b = aval * b1 + (255 - aval) * b0;
-				pixel = ((r & 0xe000) >> 8) |
-					((g & 0xe000) >> 11) |
-					((b & 0xc000) >> 14);
-			}
-			latch = (latch << 8) | pixel;
-			/* write in 32bit chunks */
-			if ((i & 3) == 3) {
-				bus_space_write_stream_4(sc->sc_memt,
-				    sc->sc_regh, R128_HOST_DATA0, latch);
-				/*
-				 * not strictly necessary, old data
-				 * should be shifted out 
-				 */
-				latch = 0;
-			}
-			data8++;
+	bg8 = R3G3B2(r0, g0, b0);
+	fg8 = R3G3B2(r1, g1, b1);
+	for (i = 0; i < ri->ri_fontscale; i++) {
+		aval = *data8;
+		if (aval == 0) {
+			pixel = bg8;
+		} else if (aval == 255) {
+			pixel = fg8;
+		} else {
+			r = aval * r1 + (255 - aval) * r0;
+			g = aval * g1 + (255 - aval) * g0;
+			b = aval * b1 + (255 - aval) * b0;
+			pixel = ((r & 0xe000) >> 8) |
+				((g & 0xe000) >> 11) |
+				((b & 0xc000) >> 14);
 		}
-		/* if we have pixels left in latch write them out */
-		if ((i & 3) != 0) {
-			latch = latch << ((4 - (i & 3)) << 3);	
+		latch = (latch << 8) | pixel;
+		/* write in 32bit chunks */
+		if ((i & 3) == 3) {
 			bus_space_write_stream_4(sc->sc_memt, sc->sc_regh,
-					    R128_HOST_DATA0, latch);
+			    R128_HOST_DATA0, latch);
+			/*
+			 * not strictly necessary, old data should be shifted 
+			 * out 
+			 */
+			latch = 0;
 		}
+		data8++;
+	}
+	/* if we have pixels left in latch write them out */
+	if ((i & 3) != 0) {
+		latch = latch << ((4 - (i & 3)) << 3);	
+		bus_space_write_stream_4(sc->sc_memt, sc->sc_regh,
+				    R128_HOST_DATA0, latch);
 	}
 }
 

Reply via email to