diff options
author | Miod Vallat <miod@cvs.openbsd.org> | 2006-08-11 18:33:14 +0000 |
---|---|---|
committer | Miod Vallat <miod@cvs.openbsd.org> | 2006-08-11 18:33:14 +0000 |
commit | 7b06209c7db4e6573ad0731517e7f24fa240dbb4 (patch) | |
tree | 55ad49d90ea1577fdfb21ca82dd743e381be45bb /sys/arch/hp300/dev | |
parent | a9c4489cb4e7b31aaeab53291a7012251f86ce12 (diff) |
Let the windowmove() callbacks return whether they could perform the operation
or not, so that we can always feed them the complex operations before falling
back to rasops; and then topcat can perform coloured solid fills in
erase{cols,rows}.
Diffstat (limited to 'sys/arch/hp300/dev')
-rw-r--r-- | sys/arch/hp300/dev/diofb.c | 60 | ||||
-rw-r--r-- | sys/arch/hp300/dev/diofb_mono.c | 9 | ||||
-rw-r--r-- | sys/arch/hp300/dev/diofbvar.h | 10 | ||||
-rw-r--r-- | sys/arch/hp300/dev/dvbox.c | 16 | ||||
-rw-r--r-- | sys/arch/hp300/dev/gbox.c | 16 | ||||
-rw-r--r-- | sys/arch/hp300/dev/rbox.c | 16 | ||||
-rw-r--r-- | sys/arch/hp300/dev/topcat.c | 19 |
7 files changed, 83 insertions, 63 deletions
diff --git a/sys/arch/hp300/dev/diofb.c b/sys/arch/hp300/dev/diofb.c index b3376daed79..56057bcdaa8 100644 --- a/sys/arch/hp300/dev/diofb.c +++ b/sys/arch/hp300/dev/diofb.c @@ -1,4 +1,4 @@ -/* $OpenBSD: diofb.c,v 1.13 2006/08/09 21:23:51 miod Exp $ */ +/* $OpenBSD: diofb.c,v 1.14 2006/08/11 18:33:13 miod Exp $ */ /* * Copyright (c) 2005, Miodrag Vallat @@ -208,7 +208,7 @@ diofb_fbsetup(struct diofb *fb) } /* Clear entire display, including non visible areas */ - (*fb->bmv)(fb, 0, 0, 0, 0, fb->fbwidth, fb->fbheight, RR_CLEAR); + (*fb->bmv)(fb, 0, 0, 0, 0, fb->fbwidth, fb->fbheight, RR_CLEAR, 0xff); strlcpy(fb->wsd.name, "std", sizeof(fb->wsd.name)); fb->wsd.ncols = ri->ri_cols; @@ -350,7 +350,7 @@ diofb_copycols(void *cookie, int row, int src, int dst, int n) (*fb->bmv)(fb, ri->ri_xorigin + src, ri->ri_yorigin + row, ri->ri_xorigin + dst, ri->ri_yorigin + row, - n, ri->ri_font->fontheight, RR_COPY); + n, ri->ri_font->fontheight, RR_COPY, 0xff); } void @@ -365,7 +365,7 @@ diofb_copyrows(void *cookie, int src, int dst, int n) (*fb->bmv)(fb, ri->ri_xorigin, ri->ri_yorigin + src, ri->ri_xorigin, ri->ri_yorigin + dst, - ri->ri_emuwidth, n, RR_COPY); + ri->ri_emuwidth, n, RR_COPY, 0xff); } void @@ -374,25 +374,21 @@ diofb_erasecols(void *cookie, int row, int col, int num, long attr) struct rasops_info *ri = cookie; struct diofb *fb = ri->ri_hw; int fg, bg; + int snum, scol, srow; rasops_unpack_attr(attr, &fg, &bg, NULL); + snum = num * ri->ri_font->fontwidth; + scol = col * ri->ri_font->fontwidth + ri->ri_xorigin; + srow = row * ri->ri_font->fontheight + ri->ri_yorigin; + /* - * If the background color is not black, this is a bit too tricky - * for the simple raster ops engine, so pass the fun to rasops. + * If this is too tricky for the simple raster ops engine, + * pass the fun to rasops. */ - if (ri->ri_devcmap[bg] != 0) { + if ((*fb->bmv)(fb, scol, srow, scol, srow, snum, + ri->ri_font->fontheight, RR_CLEAR, 0xff ^ bg) != 0) rasops_erasecols(cookie, row, col, num, attr); - return; - } - - num *= ri->ri_font->fontwidth; - col *= ri->ri_font->fontwidth; - row *= ri->ri_font->fontheight; - - (*fb->bmv)(fb, ri->ri_xorigin + col, ri->ri_yorigin + row, - ri->ri_xorigin + col, ri->ri_yorigin + row, - num, ri->ri_font->fontheight, RR_CLEAR); } void @@ -401,29 +397,23 @@ diofb_eraserows(void *cookie, int row, int num, long attr) struct rasops_info *ri = cookie; struct diofb *fb = ri->ri_hw; int fg, bg; + int srow, snum; + int rc; rasops_unpack_attr(attr, &fg, &bg, NULL); + bg ^= 0xff; - /* - * If the background color is not black, this is a bit too tricky - * for the simple raster ops engine, so pass the fun to rasops. - */ - if (ri->ri_devcmap[bg] != 0) { - rasops_eraserows(cookie, row, num, attr); - return; - } - - /* As an exception, hunt the mouse all over the screen if necessary */ if (num == ri->ri_rows && (ri->ri_flg & RI_FULLCLEAR)) { - (*fb->bmv)(fb, 0, 0, 0, 0, - ri->ri_width, ri->ri_height, RR_CLEAR); + rc = (*fb->bmv)(fb, 0, 0, 0, 0, ri->ri_width, ri->ri_height, + RR_CLEAR, bg); } else { - row *= ri->ri_font->fontheight; - num *= ri->ri_font->fontheight; - (*fb->bmv)(fb, ri->ri_xorigin, ri->ri_yorigin + row, - ri->ri_xorigin, ri->ri_yorigin + row, - ri->ri_emuwidth, num, RR_CLEAR); + srow = row * ri->ri_font->fontheight + ri->ri_yorigin; + snum = num * ri->ri_font->fontheight; + rc = (*fb->bmv)(fb, ri->ri_xorigin, srow, ri->ri_xorigin, + srow, ri->ri_emuwidth, snum, RR_CLEAR, bg); } + if (rc != 0) + rasops_eraserows(cookie, row, num, attr); } void @@ -435,7 +425,7 @@ diofb_do_cursor(struct rasops_info *ri) x = ri->ri_ccol * ri->ri_font->fontwidth + ri->ri_xorigin; y = ri->ri_crow * ri->ri_font->fontheight + ri->ri_yorigin; (*fb->bmv)(fb, x, y, x, y, ri->ri_font->fontwidth, - ri->ri_font->fontheight, RR_INVERT); + ri->ri_font->fontheight, RR_INVERT, 0xff); } /* diff --git a/sys/arch/hp300/dev/diofb_mono.c b/sys/arch/hp300/dev/diofb_mono.c index 81e36986ca9..7b7790e5e44 100644 --- a/sys/arch/hp300/dev/diofb_mono.c +++ b/sys/arch/hp300/dev/diofb_mono.c @@ -1,4 +1,4 @@ -/* $OpenBSD: diofb_mono.c,v 1.2 2006/08/05 09:58:56 miod Exp $ */ +/* $OpenBSD: diofb_mono.c,v 1.3 2006/08/11 18:33:13 miod Exp $ */ /* * Copyright (c) 2005, Miodrag Vallat. @@ -84,9 +84,10 @@ #include <dev/rasops/rasops_masks.h> #include <hp300/dev/maskbits.h> -void +int diofb_mono_windowmove(struct diofb *fb, u_int16_t sx, u_int16_t sy, - u_int16_t dx, u_int16_t dy, u_int16_t cx, u_int16_t cy, int rop) + u_int16_t dx, u_int16_t dy, u_int16_t cx, u_int16_t cy, int16_t rop, + int16_t planemask /* ignored */) { int width; /* add to get to same position in next line */ @@ -239,4 +240,6 @@ diofb_mono_windowmove(struct diofb *fb, u_int16_t sx, u_int16_t sy, } } } + + return (0); } diff --git a/sys/arch/hp300/dev/diofbvar.h b/sys/arch/hp300/dev/diofbvar.h index 9d11b22fd36..013fe7f33fb 100644 --- a/sys/arch/hp300/dev/diofbvar.h +++ b/sys/arch/hp300/dev/diofbvar.h @@ -1,4 +1,4 @@ -/* $OpenBSD: diofbvar.h,v 1.9 2006/08/09 21:23:51 miod Exp $ */ +/* $OpenBSD: diofbvar.h,v 1.10 2006/08/11 18:33:13 miod Exp $ */ /* * Copyright (c) 2005, Miodrag Vallat @@ -97,8 +97,8 @@ struct diofb { u_int mapmode; /* blockmove routine */ - void (*bmv)(struct diofb *, u_int16_t, u_int16_t, - u_int16_t, u_int16_t, u_int16_t, u_int16_t, int); + int (*bmv)(struct diofb *, u_int16_t, u_int16_t, u_int16_t, + u_int16_t, u_int16_t, u_int16_t, int16_t, int16_t); }; /* Replacement Rules (rops) */ @@ -124,8 +124,8 @@ paddr_t diofb_mmap(void *, off_t, int); int diofb_show_screen(void *, void *, int, void (*)(void *, int, int), void *); -void diofb_mono_windowmove(struct diofb *, u_int16_t, u_int16_t, - u_int16_t, u_int16_t, u_int16_t, u_int16_t, int); +int diofb_mono_windowmove(struct diofb *, u_int16_t, u_int16_t, u_int16_t, + u_int16_t, u_int16_t, u_int16_t, int16_t, int16_t); /* Console support */ void dvboxcninit(void); diff --git a/sys/arch/hp300/dev/dvbox.c b/sys/arch/hp300/dev/dvbox.c index 3d6d75e3d61..1607cda0379 100644 --- a/sys/arch/hp300/dev/dvbox.c +++ b/sys/arch/hp300/dev/dvbox.c @@ -1,4 +1,4 @@ -/* $OpenBSD: dvbox.c,v 1.12 2005/12/31 18:13:41 miod Exp $ */ +/* $OpenBSD: dvbox.c,v 1.13 2006/08/11 18:33:13 miod Exp $ */ /* * Copyright (c) 2005, Miodrag Vallat @@ -119,8 +119,8 @@ int dvbox_reset(struct diofb *, int, struct diofbreg *); void dvbox_restore(struct diofb *); void dvbox_setcolor(struct diofb *, u_int, u_int8_t, u_int8_t, u_int8_t); -void dvbox_windowmove(struct diofb *, u_int16_t, u_int16_t, - u_int16_t, u_int16_t, u_int16_t, u_int16_t, int); +int dvbox_windowmove(struct diofb *, u_int16_t, u_int16_t, u_int16_t, + u_int16_t, u_int16_t, u_int16_t, int16_t, int16_t); int dvbox_ioctl(void *, u_long, caddr_t, int, struct proc *); void dvbox_burner(void *, u_int, u_int); @@ -394,12 +394,16 @@ dvbox_burner(void *v, u_int on, u_int flags) db->dispen = 0x00; } -void +int dvbox_windowmove(struct diofb *fb, u_int16_t sx, u_int16_t sy, - u_int16_t dx, u_int16_t dy, u_int16_t cx, u_int16_t cy, int rop) + u_int16_t dx, u_int16_t dy, u_int16_t cx, u_int16_t cy, int16_t rop, + int16_t planemask) { volatile struct dvboxfb *db = (struct dvboxfb *)fb->regkva; + if (planemask != 0xff) + return (EINVAL); + db_waitbusy(db); db->rep_rule = DVBOX_DUALROP(rop); @@ -412,6 +416,8 @@ dvbox_windowmove(struct diofb *fb, u_int16_t sx, u_int16_t sy, db->wmove = 1; db_waitbusy(db); + + return (0); } /* diff --git a/sys/arch/hp300/dev/gbox.c b/sys/arch/hp300/dev/gbox.c index bb35fa3da72..f6068d66a21 100644 --- a/sys/arch/hp300/dev/gbox.c +++ b/sys/arch/hp300/dev/gbox.c @@ -1,4 +1,4 @@ -/* $OpenBSD: gbox.c,v 1.13 2005/12/31 18:13:41 miod Exp $ */ +/* $OpenBSD: gbox.c,v 1.14 2006/08/11 18:33:13 miod Exp $ */ /* * Copyright (c) 2005, Miodrag Vallat @@ -123,8 +123,8 @@ int gbox_reset(struct diofb *, int, struct diofbreg *); void gbox_restore(struct diofb *); int gbox_setcmap(struct diofb *, struct wsdisplay_cmap *); void gbox_setcolor(struct diofb *, u_int); -void gbox_windowmove(struct diofb *, u_int16_t, u_int16_t, - u_int16_t, u_int16_t, u_int16_t, u_int16_t, int); +int gbox_windowmove(struct diofb *, u_int16_t, u_int16_t, u_int16_t, + u_int16_t, u_int16_t, u_int16_t, int16_t, int16_t); int gbox_ioctl(void *, u_long, caddr_t, int, struct proc *); void gbox_burner(void *, u_int, u_int); @@ -405,13 +405,17 @@ gbox_setcmap(struct diofb *fb, struct wsdisplay_cmap *cm) return (0); } -void +int gbox_windowmove(struct diofb *fb, u_int16_t sx, u_int16_t sy, - u_int16_t dx, u_int16_t dy, u_int16_t cx, u_int16_t cy, int rop) + u_int16_t dx, u_int16_t dy, u_int16_t cx, u_int16_t cy, int16_t rop, + int16_t planemask) { volatile struct gboxfb *gb = (struct gboxfb *)fb->regkva; int src, dest; + if (planemask != 0xff) + return (EINVAL); + src = (sy * 1024) + sx; /* upper left corner in pixels */ dest = (dy * 1024) + dx; @@ -432,6 +436,8 @@ gbox_windowmove(struct diofb *fb, u_int16_t sx, u_int16_t sy, FBBASE(fb)[dest] = FBBASE(fb)[src]; tile_mover_waitbusy(gb); + + return (0); } /* diff --git a/sys/arch/hp300/dev/rbox.c b/sys/arch/hp300/dev/rbox.c index 92951682cbc..b18db52aaaf 100644 --- a/sys/arch/hp300/dev/rbox.c +++ b/sys/arch/hp300/dev/rbox.c @@ -1,4 +1,4 @@ -/* $OpenBSD: rbox.c,v 1.13 2005/12/31 18:13:41 miod Exp $ */ +/* $OpenBSD: rbox.c,v 1.14 2006/08/11 18:33:13 miod Exp $ */ /* * Copyright (c) 2005, Miodrag Vallat @@ -119,8 +119,8 @@ int rbox_reset(struct diofb *, int, struct diofbreg *); void rbox_restore(struct diofb *); void rbox_setcolor(struct diofb *, u_int, u_int8_t, u_int8_t, u_int8_t); -void rbox_windowmove(struct diofb *, u_int16_t, u_int16_t, - u_int16_t, u_int16_t, u_int16_t, u_int16_t, int); +int rbox_windowmove(struct diofb *, u_int16_t, u_int16_t, u_int16_t, + u_int16_t, u_int16_t, u_int16_t, int16_t, int16_t); int rbox_ioctl(void *, u_long, caddr_t, int, struct proc *); void rbox_burner(void *, u_int, u_int); @@ -357,12 +357,16 @@ rbox_burner(void *v, u_int on, u_int flags) } } -void +int rbox_windowmove(struct diofb *fb, u_int16_t sx, u_int16_t sy, - u_int16_t dx, u_int16_t dy, u_int16_t cx, u_int16_t cy, int rop) + u_int16_t dx, u_int16_t dy, u_int16_t cx, u_int16_t cy, int16_t rop, + int16_t planemask) { volatile struct rboxfb *rb = (struct rboxfb *)fb->regkva; + if (planemask != 0xff) + return (EINVAL); + rb_waitbusy(rb); rb->rep_rule = RBOX_DUALROP(rop); @@ -375,6 +379,8 @@ rbox_windowmove(struct diofb *fb, u_int16_t sx, u_int16_t sy, rb->wmove = 1; rb_waitbusy(rb); + + return (0); } /* diff --git a/sys/arch/hp300/dev/topcat.c b/sys/arch/hp300/dev/topcat.c index 8ad9c6a8425..051c990ea47 100644 --- a/sys/arch/hp300/dev/topcat.c +++ b/sys/arch/hp300/dev/topcat.c @@ -1,4 +1,4 @@ -/* $OpenBSD: topcat.c,v 1.14 2005/12/31 18:13:41 miod Exp $ */ +/* $OpenBSD: topcat.c,v 1.15 2006/08/11 18:33:13 miod Exp $ */ /* * Copyright (c) 2005, Miodrag Vallat. @@ -122,8 +122,8 @@ int topcat_reset(struct diofb *, int, struct diofbreg *); void topcat_restore(struct diofb *); int topcat_setcmap(struct diofb *, struct wsdisplay_cmap *); void topcat_setcolor(struct diofb *, u_int); -void topcat_windowmove(struct diofb *, u_int16_t, u_int16_t, - u_int16_t, u_int16_t, u_int16_t, u_int16_t, int); +int topcat_windowmove(struct diofb *, u_int16_t, u_int16_t, u_int16_t, + u_int16_t, u_int16_t, u_int16_t, int16_t, int16_t); int topcat_ioctl(void *, u_long, caddr_t, int, struct proc *); void topcat_burner(void *, u_int, u_int); @@ -475,15 +475,22 @@ topcat_setcmap(struct diofb *fb, struct wsdisplay_cmap *cm) * Accelerated routines */ -void +int topcat_windowmove(struct diofb *fb, u_int16_t sx, u_int16_t sy, - u_int16_t dx, u_int16_t dy, u_int16_t cx, u_int16_t cy, int rop) + u_int16_t dx, u_int16_t dy, u_int16_t cx, u_int16_t cy, int16_t rop, + int16_t planemask) { volatile struct tcboxfb *tc = (struct tcboxfb *)fb->regkva; tc_waitbusy(tc, fb->planemask); + tc->wen = planemask; tc->wmrr = rop; + if (planemask != 0xff) { + tc->wen = planemask ^ 0xff; + tc->wmrr = rop ^ 0x0f; + tc->wen = fb->planemask; + } tc->source_y = sy; tc->source_x = sx; tc->dest_y = dy; @@ -493,6 +500,8 @@ topcat_windowmove(struct diofb *fb, u_int16_t sx, u_int16_t sy, tc->wmove = fb->planemask; tc_waitbusy(tc, fb->planemask); + + return (0); } /* |