Created
September 19, 2014 13:22
-
-
Save ao-kenji/00134f251bfbeec5d9fa to your computer and use it in GitHub Desktop.
[Merged into original tree] A trial to use LUNA frame buffer's ROP function on OpenBSD/luna88k. It makes 4bpp putchar about 20% faster.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Index: sys/arch/luna88k/dev/omrasops.c | |
=================================================================== | |
RCS file: /cvs/src/sys/arch/luna88k/dev/omrasops.c,v | |
retrieving revision 1.11 | |
diff -u -r1.11 omrasops.c | |
--- sys/arch/luna88k/dev/omrasops.c 2 Jan 2014 15:30:34 -0000 1.11 | |
+++ sys/arch/luna88k/dev/omrasops.c 19 Sep 2014 13:22:11 -0000 | |
@@ -175,8 +175,15 @@ | |
width = ri->ri_font->fontwidth + align; | |
lmask = ALL1BITS >> align; | |
rmask = ALL1BITS << (-width & ALIGNMASK); | |
+ | |
+ /* select all planes for later ROP function target */ | |
+ *(volatile u_int32_t *)OMFB_PLANEMASK = 0xff; | |
+ | |
if (width <= BLITWIDTH) { | |
lmask &= rmask; | |
+ /* set lmask as ROP mask value, with THROUGH mode */ | |
+ ((volatile u_int32_t *)OMFB_ROPFUNC)[5] = lmask; | |
+ | |
while (height > 0) { | |
glyph = 0; | |
for (i = ri->ri_font->stride; i != 0; i--) | |
@@ -187,20 +194,22 @@ | |
fgpat = (fg & 0x01) ? glyph : 0; | |
bgpat = (bg & 0x01) ? glyphbg : 0; | |
- *P0(p) = (*P0(p) & ~lmask) | ((fgpat | bgpat) & lmask); | |
+ *P0(p) = (fgpat | bgpat); | |
fgpat = (fg & 0x02) ? glyph : 0; | |
bgpat = (bg & 0x02) ? glyphbg : 0; | |
- *P1(p) = (*P1(p) & ~lmask) | ((fgpat | bgpat) & lmask); | |
+ *P1(p) = (fgpat | bgpat); | |
fgpat = (fg & 0x04) ? glyph : 0; | |
bgpat = (bg & 0x04) ? glyphbg : 0; | |
- *P2(p) = (*P2(p) & ~lmask) | ((fgpat | bgpat) & lmask); | |
+ *P2(p) = (fgpat | bgpat); | |
fgpat = (fg & 0x08) ? glyph : 0; | |
bgpat = (bg & 0x08) ? glyphbg : 0; | |
- *P3(p) = (*P3(p) & ~lmask) | ((fgpat | bgpat) & lmask); | |
+ *P3(p) = (fgpat | bgpat); | |
p += scanspan; | |
height--; | |
} | |
+ /* reset mask value */ | |
+ ((volatile u_int32_t *)OMFB_ROPFUNC)[5] = ALL1BITS; | |
} else { | |
u_int8_t *q = p; | |
u_int32_t lhalf, rhalf; | |
@@ -213,42 +222,50 @@ | |
glyph <<= (4 - ri->ri_font->stride) * NBBY; | |
lhalf = (glyph >> align); | |
lhalfbg = lhalf ^ ALL1BITS; | |
+ /* set lmask as ROP mask value, with THROUGH mode */ | |
+ ((volatile u_int32_t *)OMFB_ROPFUNC)[5] = lmask; | |
fgpat = (fg & 0x01) ? lhalf : 0; | |
bgpat = (bg & 0x01) ? lhalfbg : 0; | |
- *P0(p) = (*P0(p) & ~lmask) | ((fgpat | bgpat) & lmask); | |
+ *P0(p) = (fgpat | bgpat); | |
fgpat = (fg & 0x02) ? lhalf : 0; | |
bgpat = (bg & 0x02) ? lhalfbg : 0; | |
- *P1(p) = (*P1(p) & ~lmask) | ((fgpat | bgpat) & lmask); | |
+ *P1(p) = (fgpat | bgpat); | |
fgpat = (fg & 0x04) ? lhalf : 0; | |
bgpat = (bg & 0x04) ? lhalfbg : 0; | |
- *P2(p) = (*P2(p) & ~lmask) | ((fgpat | bgpat) & lmask); | |
+ *P2(p) = (fgpat | bgpat); | |
fgpat = (fg & 0x08) ? lhalf : 0; | |
bgpat = (bg & 0x08) ? lhalfbg : 0; | |
- *P3(p) = (*P3(p) & ~lmask) | ((fgpat | bgpat) & lmask); | |
+ *P3(p) = (fgpat | bgpat); | |
p += BYTESDONE; | |
rhalf = (glyph << (BLITWIDTH - align)); | |
rhalfbg = rhalf ^ ALL1BITS; | |
+ /* set rmask as ROP mask value, with THROUGH mode */ | |
+ ((volatile u_int32_t *)OMFB_ROPFUNC)[5] = rmask; | |
fgpat = (fg & 0x01) ? rhalf : 0; | |
bgpat = (bg & 0x01) ? rhalfbg : 0; | |
- *P0(p) = ((fgpat | bgpat) & rmask) | (*P0(p) & ~rmask); | |
+ *P0(p) = (fgpat | bgpat); | |
fgpat = (fg & 0x02) ? rhalf : 0; | |
bgpat = (bg & 0x02) ? rhalfbg : 0; | |
- *P1(p) = ((fgpat | bgpat) & rmask) | (*P1(p) & ~rmask); | |
+ *P1(p) = (fgpat | bgpat); | |
fgpat = (fg & 0x04) ? rhalf : 0; | |
bgpat = (bg & 0x04) ? rhalfbg : 0; | |
- *P2(p) = ((fgpat | bgpat) & rmask) | (*P2(p) & ~rmask); | |
+ *P2(p) = (fgpat | bgpat); | |
fgpat = (fg & 0x08) ? rhalf : 0; | |
bgpat = (bg & 0x08) ? rhalfbg : 0; | |
- *P3(p) = ((fgpat | bgpat) & rmask) | (*P3(p) & ~rmask); | |
+ *P3(p) = (fgpat | bgpat); | |
p = (q += scanspan); | |
height--; | |
} | |
+ /* reset mask value */ | |
+ ((volatile u_int32_t *)OMFB_ROPFUNC)[5] = ALL1BITS; | |
} | |
+ /* select plane #0 only; XXX need this ? */ | |
+ *(volatile u_int32_t *)OMFB_PLANEMASK = 0x01; | |
return 0; | |
} | |
@@ -408,7 +425,7 @@ | |
struct rasops_info *ri = cookie; | |
u_int8_t *p; | |
int scanspan, startx, height, width, align, y; | |
- u_int32_t lmask, rmask, image; | |
+ u_int32_t lmask, rmask; | |
if (!on) { | |
/* make sure it's on */ | |
@@ -433,48 +450,45 @@ | |
width = ri->ri_font->fontwidth + align; | |
lmask = ALL1BITS >> align; | |
rmask = ALL1BITS << (-width & ALIGNMASK); | |
+ | |
+ /* select all planes for later ROP function target */ | |
+ *(volatile u_int32_t *)OMFB_PLANEMASK = 0xff; | |
+ | |
if (width <= BLITWIDTH) { | |
lmask &= rmask; | |
+ /* set lmask as ROP mask value, with INV2 mode */ | |
+ ((volatile u_int32_t *)OMFB_ROPFUNC)[12] = lmask; | |
+ | |
while (height > 0) { | |
- image = *P0(p); | |
- *P0(p) = (image & ~lmask) | ((image ^ ALL1BITS) & lmask); | |
- image = *P1(p); | |
- *P1(p) = (image & ~lmask) | ((image ^ ALL1BITS) & lmask); | |
- image = *P2(p); | |
- *P2(p) = (image & ~lmask) | ((image ^ ALL1BITS) & lmask); | |
- image = *P3(p); | |
- *P3(p) = (image & ~lmask) | ((image ^ ALL1BITS) & lmask); | |
+ *W(p) = ALL1BITS; | |
p += scanspan; | |
height--; | |
} | |
+ /* reset mask value */ | |
+ ((volatile u_int32_t *)OMFB_ROPFUNC)[5] = ALL1BITS; | |
} else { | |
u_int8_t *q = p; | |
while (height > 0) { | |
- image = *P0(p); | |
- *P0(p) = (image & ~lmask) | ((image ^ ALL1BITS) & lmask); | |
- image = *P1(p); | |
- *P1(p) = (image & ~lmask) | ((image ^ ALL1BITS) & lmask); | |
- image = *P2(p); | |
- *P2(p) = (image & ~lmask) | ((image ^ ALL1BITS) & lmask); | |
- image = *P3(p); | |
- *P3(p) = (image & ~lmask) | ((image ^ ALL1BITS) & lmask); | |
+ /* set lmask as ROP mask value, with INV2 mode */ | |
+ ((volatile u_int32_t *)OMFB_ROPFUNC)[12] = lmask; | |
+ *W(p) = ALL1BITS; | |
p += BYTESDONE; | |
- image = *P0(p); | |
- *P0(p) = ((image ^ ALL1BITS) & rmask) | (image & ~rmask); | |
- image = *P1(p); | |
- *P1(p) = ((image ^ ALL1BITS) & rmask) | (image & ~rmask); | |
- image = *P2(p); | |
- *P2(p) = ((image ^ ALL1BITS) & rmask) | (image & ~rmask); | |
- image = *P3(p); | |
- *P3(p) = ((image ^ ALL1BITS) & rmask) | (image & ~rmask); | |
+ /* set rmask as ROP mask value, with INV2 mode */ | |
+ ((volatile u_int32_t *)OMFB_ROPFUNC)[12] = rmask; | |
+ *W(p) = ALL1BITS; | |
p = (q += scanspan); | |
height--; | |
} | |
+ /* reset mask value */ | |
+ ((volatile u_int32_t *)OMFB_ROPFUNC)[5] = ALL1BITS; | |
} | |
+ /* select plane #0 only; XXX need this ? */ | |
+ *(volatile u_int32_t *)OMFB_PLANEMASK = 0x01; | |
+ | |
ri->ri_flg ^= RI_CURSOR; | |
return 0; | |
Index: sys/arch/luna88k/dev/omrasops.h | |
=================================================================== | |
RCS file: /cvs/src/sys/arch/luna88k/dev/omrasops.h,v | |
retrieving revision 1.2 | |
diff -u -r1.2 omrasops.h | |
--- sys/arch/luna88k/dev/omrasops.h 2 Jan 2014 15:30:34 -0000 1.2 | |
+++ sys/arch/luna88k/dev/omrasops.h 19 Sep 2014 13:22:11 -0000 | |
@@ -18,14 +18,17 @@ | |
* Base addresses of LUNA's frame buffer | |
* XXX: We consider only 1bpp and 4bpp for now | |
*/ | |
+ | |
+#define OMFB_PLANEMASK 0xB1040000 /* BMSEL register */ | |
#define OMFB_FB_WADDR 0xB1080008 /* common plane */ | |
#define OMFB_FB_RADDR 0xB10C0008 /* plane #0 */ | |
+#define OMFB_ROPFUNC 0xB12C0000 /* common ROP function */ | |
/* | |
* Helper macros | |
*/ | |
-#define W(addr) ((u_int32_t *)(addr)) | |
-#define R(addr) ((u_int32_t *)((u_int8_t *)(addr) + 0x40000)) | |
+#define W(addr) ((u_int32_t *)(addr)) | |
+#define R(addr) ((u_int32_t *)((u_int8_t *)(addr) + 0x40000)) | |
#define P0(addr) ((u_int32_t *)((u_int8_t *)(addr) + 0x40000)) | |
#define P1(addr) ((u_int32_t *)((u_int8_t *)(addr) + 0x80000)) | |
#define P2(addr) ((u_int32_t *)((u_int8_t *)(addr) + 0xC0000)) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment