Created
September 24, 2014 12:04
-
-
Save ao-kenji/454c379daca37b425210 to your computer and use it in GitHub Desktop.
Change the drawing order, but the speed is almost the same as luna88k-rop-140919-1.diff.
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 24 Sep 2014 11:55:24 -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,25 +194,31 @@ | |
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_int8_t *fb0 = fb; | |
u_int32_t lhalf, rhalf; | |
u_int32_t lhalfbg, rhalfbg; | |
+ int height0 = height; | |
+ /* 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--) | |
@@ -216,39 +229,56 @@ | |
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; | |
+ p += scanspan; | |
+ height--; | |
+ } | |
+ p = q + BYTESDONE; | |
+ fb = fb0; | |
+ height = height0; | |
+ | |
+ /* set rmask as ROP mask value, with THROUGH mode */ | |
+ ((volatile u_int32_t *)OMFB_ROPFUNC)[5] = rmask; | |
+ while (height > 0) { | |
+ glyph = 0; | |
+ for (i = ri->ri_font->stride; i != 0; i--) | |
+ glyph = (glyph << 8) | *fb++; | |
+ glyph <<= (4 - ri->ri_font->stride) * NBBY; | |
rhalf = (glyph << (BLITWIDTH - align)); | |
rhalfbg = rhalf ^ ALL1BITS; | |
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); | |
+ p += 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 +438,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 +463,50 @@ | |
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; | |
+ int height0 = height; | |
+ /* 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); | |
- | |
- p += BYTESDONE; | |
+ *W(p) = ALL1BITS; | |
+ p += scanspan; | |
+ height--; | |
+ } | |
- 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); | |
+ p = q + BYTESDONE; | |
+ height = height0; | |
- p = (q += scanspan); | |
+ /* set rmask as ROP mask value, with INV2 mode */ | |
+ ((volatile u_int32_t *)OMFB_ROPFUNC)[12] = rmask; | |
+ while (height > 0) { | |
+ *W(p) = ALL1BITS; | |
+ p += 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 24 Sep 2014 11:55:24 -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