Module Name: src
Committed By: macallan
Date: Wed Jan 16 00:09:27 UTC 2013
Modified Files:
src/sys/arch/arm/omap: omapfb.c
Log Message:
implement right to left and bottom to top blits, now scrolling works right
in all directions.
while there, fix the xor mask for the cursor attribute - now it's actually
inverted
To generate a diff of this commit:
cvs rdiff -u -r1.10 -r1.11 src/sys/arch/arm/omap/omapfb.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/arch/arm/omap/omapfb.c
diff -u src/sys/arch/arm/omap/omapfb.c:1.10 src/sys/arch/arm/omap/omapfb.c:1.11
--- src/sys/arch/arm/omap/omapfb.c:1.10 Thu Jan 10 02:18:06 2013
+++ src/sys/arch/arm/omap/omapfb.c Wed Jan 16 00:09:27 2013
@@ -1,4 +1,4 @@
-/* $NetBSD: omapfb.c,v 1.10 2013/01/10 02:18:06 macallan Exp $ */
+/* $NetBSD: omapfb.c,v 1.11 2013/01/16 00:09:27 macallan Exp $ */
/*
* Copyright (c) 2010 Michael Lorenz
@@ -31,7 +31,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: omapfb.c,v 1.10 2013/01/10 02:18:06 macallan Exp $");
+__KERNEL_RCSID(0, "$NetBSD: omapfb.c,v 1.11 2013/01/16 00:09:27 macallan Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -666,26 +666,43 @@ omapfb_bitblt(struct omapfb_softc *sc, i
int wi, int he, int rop)
{
int width_in_bytes = wi * (sc->sc_depth >> 3);
+ int hstep, vstep;
+ uint32_t saddr, daddr;
omapfb_wait_idle(sc);
- /*
- * TODO:
- * handle overlaps ( as in, go backwards when needed )
- */
+ saddr = sc->sc_fbhwaddr + sc->sc_stride * ys + xs * (sc->sc_depth >> 3);
+ daddr = sc->sc_fbhwaddr + sc->sc_stride * yd + xd * (sc->sc_depth >> 3);
+ if (ys < yd) {
+ /* need to go vertically backwards */
+ vstep = 1 - (sc->sc_stride + width_in_bytes);
+ saddr += sc->sc_stride * (he - 1);
+ daddr += sc->sc_stride * (he - 1);
+ } else
+ vstep = (sc->sc_stride - width_in_bytes) + 1;
+ if ((xs < xd) && (ys == yd)) {
+ /*
+ * need to go horizontally backwards, only needed if source
+ * and destination pixels are on the same line
+ */
+ hstep = 1 - (sc->sc_depth >> 2);
+ vstep = sc->sc_stride + (sc->sc_depth >> 3) * (wi - 1) + 1;
+ saddr += (sc->sc_depth >> 3) * (wi - 1);
+ daddr += (sc->sc_depth >> 3) * (wi - 1);
+ } else
+ hstep = 1;
+
omapdma_write_ch_reg(0, OMAPDMAC_CEN, wi);
omapdma_write_ch_reg(0, OMAPDMAC_CFN, he);
- omapdma_write_ch_reg(0, OMAPDMAC_CSSA,
- sc->sc_fbhwaddr + sc->sc_stride * ys + xs * (sc->sc_depth >> 3));
- omapdma_write_ch_reg(0, OMAPDMAC_CDSA,
- sc->sc_fbhwaddr + sc->sc_stride * yd + xd * (sc->sc_depth >> 3));
+ omapdma_write_ch_reg(0, OMAPDMAC_CSSA, saddr);
+ omapdma_write_ch_reg(0, OMAPDMAC_CDSA, daddr);
omapdma_write_ch_reg(0, OMAPDMAC_CCR,
CCR_DST_AMODE_DOUBLE_INDEX |
CCR_SRC_AMODE_DOUBLE_INDEX);
- omapdma_write_ch_reg(0, OMAPDMAC_CSEI, 1);
- omapdma_write_ch_reg(0, OMAPDMAC_CSFI, (sc->sc_stride - width_in_bytes) + 1);
- omapdma_write_ch_reg(0, OMAPDMAC_CDEI, 1);
- omapdma_write_ch_reg(0, OMAPDMAC_CDFI, (sc->sc_stride - width_in_bytes) + 1);
+ omapdma_write_ch_reg(0, OMAPDMAC_CSEI, hstep);
+ omapdma_write_ch_reg(0, OMAPDMAC_CSFI, vstep);
+ omapdma_write_ch_reg(0, OMAPDMAC_CDEI, hstep);
+ omapdma_write_ch_reg(0, OMAPDMAC_CDFI, vstep);
omapdma_write_ch_reg(0, OMAPDMAC_CCR,
CCR_DST_AMODE_DOUBLE_INDEX |
CCR_SRC_AMODE_DOUBLE_INDEX | CCR_ENABLE);
@@ -715,7 +732,7 @@ omapfb_cursor(void *cookie, int on, int
ri->ri_ccol = col;
if (on) {
omapfb_putchar(cookie, row, col, scr->scr_chars[pos],
- scr->scr_attrs[pos] ^ 0x000f0f00);
+ scr->scr_attrs[pos] ^ 0x0f0f0000);
ri->ri_flg |= RI_CURSOR;
}
} else {
@@ -723,7 +740,6 @@ omapfb_cursor(void *cookie, int on, int
scr->scr_ri.ri_ccol = col;
scr->scr_ri.ri_flg &= ~RI_CURSOR;
}
-
}
static void