Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/sys/dev/pci split putchar into separate methods for bitmap a...
details: https://anonhg.NetBSD.org/src/rev/684088354f7d
branches: trunk
changeset: 772434:684088354f7d
user: macallan <macallan%NetBSD.org@localhost>
date: Wed Jan 04 07:56:35 2012 +0000
description:
split putchar into separate methods for bitmap and alpha fonts, use
FONT_IS_ALPHA()
diffstat:
sys/dev/pci/r128fb.c | 327 ++++++++++++++++++++++++++++----------------------
1 files changed, 180 insertions(+), 147 deletions(-)
diffs (truncated from 451 to 300 lines):
diff -r b14f6caf0dde -r 684088354f7d sys/dev/pci/r128fb.c
--- a/sys/dev/pci/r128fb.c Wed Jan 04 03:43:34 2012 +0000
+++ b/sys/dev/pci/r128fb.c Wed Jan 04 07:56:35 2012 +0000
@@ -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_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 @@
} 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 @@
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 @@
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 @@
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 @@
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 @@
}
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 @@
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 @@
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_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_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_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);
+ /*
+ * 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);
+ /* 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);
+ 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 (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;
+ 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);
+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;
Home |
Main Index |
Thread Index |
Old Index