On Mon, Apr 30, 2018 at 06:13:00PM +0000, Miod Vallat wrote:
> > On Sun, Apr 29, 2018 at 09:42:00AM +0000, Miod Vallat wrote:
> > >
> > > > Don't use attr uninitialised. Avoids glitches seen when using
> > > > scrollback with radeondrm.
> > >
> > > That's horrible. The bg attribute should be passed to the function,
> > > rather than computed here with possibly wrong values.
> > >
> >
> > You didn't include a diff so I guess you propose something like this?
>
> I'm not sure this is correct, but that's probably better.
>
> My point is that, if you need to erase a few rows, you need to use the
> default (non kernel) background attribute. This attribute depends from
> the wsdisplay emulation in use (it's edp->defattr). But since the
> emulation is the one asking for scrollback, it should be easy to plumb
> it down the way - adding an extra argument to the .scrollback
> wsdisplay_accessops and then to rasops_scrollback().
scrollback isn't part of wsdisplay_emulops but rather wsdisplay_accessops.
It isn't clear how to properly get an attr in wsscrollback()
GETCHAR/getchar is part of wsmoused and sc->sc_accessops->getchar
may be NULL.
Index: dev/ic/vga.c
===================================================================
RCS file: /cvs/src/sys/dev/ic/vga.c,v
retrieving revision 1.69
diff -u -p -r1.69 vga.c
--- dev/ic/vga.c 17 Jun 2017 19:20:30 -0000 1.69
+++ dev/ic/vga.c 1 May 2018 03:09:58 -0000
@@ -250,7 +250,7 @@ int vga_show_screen(void *, void *, int,
void (*) (void *, int, int), void *);
int vga_load_font(void *, void *, struct wsdisplay_font *);
int vga_list_font(void *, struct wsdisplay_font *);
-void vga_scrollback(void *, void *, int);
+void vga_scrollback(void *, void *, int, long);
void vga_burner(void *v, u_int on, u_int flags);
int vga_getchar(void *, int, int, struct wsdisplay_charcell *);
@@ -942,7 +942,7 @@ vga_list_font(void *v, struct wsdisplay_
}
void
-vga_scrollback(void *v, void *cookie, int lines)
+vga_scrollback(void *v, void *cookie, int lines, long attr)
{
struct vga_config *vc = v;
struct vgascreen *scr = cookie;
@@ -1157,7 +1157,7 @@ vga_putchar(void *c, int row, int col, u
s = spltty();
if (scr->pcs.active && scr->pcs.visibleoffset != scr->pcs.dispoffset)
- vga_scrollback(scr->cfg, scr, 0);
+ vga_scrollback(scr->cfg, scr, 0, attr);
rc = pcdisplay_putchar(c, row, col, uc, attr);
splx(s);
Index: dev/pci/drm/i915/i915_drv.c
===================================================================
RCS file: /cvs/src/sys/dev/pci/drm/i915/i915_drv.c,v
retrieving revision 1.112
diff -u -p -r1.112 i915_drv.c
--- dev/pci/drm/i915/i915_drv.c 27 Apr 2018 21:36:12 -0000 1.112
+++ dev/pci/drm/i915/i915_drv.c 1 May 2018 03:06:37 -0000
@@ -1925,7 +1925,7 @@ int inteldrm_list_font(void *, struct ws
int inteldrm_getchar(void *, int, int, struct wsdisplay_charcell *);
void inteldrm_burner(void *, u_int, u_int);
void inteldrm_burner_cb(void *);
-void inteldrm_scrollback(void *, void *, int lines);
+void inteldrm_scrollback(void *, void *, int, long);
struct wsscreen_descr inteldrm_stdscreen = {
"std",
@@ -2177,12 +2177,12 @@ const struct backlight_ops inteldrm_back
};
void
-inteldrm_scrollback(void *v, void *cookie, int lines)
+inteldrm_scrollback(void *v, void *cookie, int lines, long attr)
{
struct inteldrm_softc *dev_priv = v;
struct rasops_info *ri = &dev_priv->ro;
- rasops_scrollback(ri, cookie, lines);
+ rasops_scrollback(ri, cookie, lines, attr);
}
int inteldrm_match(struct device *, void *, void *);
Index: dev/pci/drm/radeon/radeon_kms.c
===================================================================
RCS file: /cvs/src/sys/dev/pci/drm/radeon/radeon_kms.c,v
retrieving revision 1.55
diff -u -p -r1.55 radeon_kms.c
--- dev/pci/drm/radeon/radeon_kms.c 25 Apr 2018 01:27:46 -0000 1.55
+++ dev/pci/drm/radeon/radeon_kms.c 28 Apr 2018 01:39:19 -0000
@@ -202,6 +202,7 @@ struct wsdisplay_accessops radeondrm_acc
.getchar = rasops_getchar,
.load_font = rasops_load_font,
.list_font = rasops_list_font,
+ .scrollback = rasops_scrollback,
.burn_screen = radeondrm_burner
};
Index: dev/rasops/rasops.c
===================================================================
RCS file: /cvs/src/sys/dev/rasops/rasops.c,v
retrieving revision 1.53
diff -u -p -r1.53 rasops.c
--- dev/rasops/rasops.c 27 Apr 2018 21:36:12 -0000 1.53
+++ dev/rasops/rasops.c 1 May 2018 03:04:54 -0000
@@ -1541,7 +1541,7 @@ rasops_vcons_putchar(void *cookie, int r
int off = row * scr->rs_ri->ri_cols + col + scr->rs_dispoffset;
if (scr->rs_visible && scr->rs_visibleoffset != scr->rs_dispoffset)
- rasops_scrollback(scr->rs_ri, scr, 0);
+ rasops_scrollback(scr->rs_ri, scr, 0, attr);
scr->rs_bs[off].uc = uc;
scr->rs_bs[off].attr = attr;
@@ -1901,12 +1901,11 @@ rasops_list_font(void *v, struct wsdispl
}
void
-rasops_scrollback(void *v, void *cookie, int lines)
+rasops_scrollback(void *v, void *cookie, int lines, long attr)
{
struct rasops_info *ri = v;
struct rasops_screen *scr = cookie;
int row, col, oldvoff;
- long attr;
oldvoff = scr->rs_visibleoffset;
Index: dev/rasops/rasops.h
===================================================================
RCS file: /cvs/src/sys/dev/rasops/rasops.h,v
retrieving revision 1.22
diff -u -p -r1.22 rasops.h
--- dev/rasops/rasops.h 27 Apr 2018 21:36:12 -0000 1.22
+++ dev/rasops/rasops.h 1 May 2018 03:05:01 -0000
@@ -178,7 +178,7 @@ int rasops_show_screen(void *, void *, i
int rasops_load_font(void *, void *, struct wsdisplay_font *);
int rasops_list_font(void *, struct wsdisplay_font *);
int rasops_getchar(void *, int, int, struct wsdisplay_charcell *);
-void rasops_scrollback(void *, void *, int);
+void rasops_scrollback(void *, void *, int, long);
extern const u_char rasops_isgray[16];
extern const u_char rasops_cmap[256*3];
Index: dev/wscons/wsdisplay.c
===================================================================
RCS file: /cvs/src/sys/dev/wscons/wsdisplay.c,v
retrieving revision 1.131
diff -u -p -r1.131 wsdisplay.c
--- dev/wscons/wsdisplay.c 19 Feb 2018 08:59:52 -0000 1.131
+++ dev/wscons/wsdisplay.c 1 May 2018 03:03:29 -0000
@@ -2264,6 +2264,7 @@ void
wsscrollback(void *arg, int op)
{
struct wsdisplay_softc *sc = arg;
+ struct wsdisplay_charcell cell;
int lines;
if (sc->sc_focus == NULL)
@@ -2278,8 +2279,9 @@ wsscrollback(void *arg, int op)
}
if (sc->sc_accessops->scrollback) {
+ GETCHAR(sc->sc_focus, 0, &cell);
(*sc->sc_accessops->scrollback)(sc->sc_accesscookie,
- sc->sc_focus->scr_dconf->emulcookie, lines);
+ sc->sc_focus->scr_dconf->emulcookie, lines, cell.attr);
}
}
#endif
Index: dev/wscons/wsdisplayvar.h
===================================================================
RCS file: /cvs/src/sys/dev/wscons/wsdisplayvar.h,v
retrieving revision 1.31
diff -u -p -r1.31 wsdisplayvar.h
--- dev/wscons/wsdisplayvar.h 19 Jul 2017 14:34:10 -0000 1.31
+++ dev/wscons/wsdisplayvar.h 1 May 2018 01:17:43 -0000
@@ -141,7 +141,7 @@ struct wsdisplay_accessops {
void (*) (void *, int, int), void *);
int (*load_font)(void *, void *, struct wsdisplay_font *);
int (*list_font)(void *, struct wsdisplay_font *);
- void (*scrollback)(void *, void *, int);
+ void (*scrollback)(void *, void *, int, long);
int (*getchar)(void *, int, int, struct wsdisplay_charcell *);
void (*burn_screen)(void *, u_int, u_int);
void (*pollc)(void *, int);
Index: arch/amd64/amd64/efifb.c
===================================================================
RCS file: /cvs/src/sys/arch/amd64/amd64/efifb.c,v
retrieving revision 1.16
diff -u -p -r1.16 efifb.c
--- arch/amd64/amd64/efifb.c 27 Apr 2018 21:36:12 -0000 1.16
+++ arch/amd64/amd64/efifb.c 1 May 2018 03:07:40 -0000
@@ -101,7 +101,7 @@ int efifb_show_screen(void *, void *, i
void *);
int efifb_list_font(void *, struct wsdisplay_font *);
int efifb_load_font(void *, void *, struct wsdisplay_font *);
-void efifb_scrollback(void *, void *, int lines);
+void efifb_scrollback(void *, void *, int, long);
void efifb_efiinfo_init(struct efifb *);
void efifb_cnattach_common(void);
@@ -402,12 +402,12 @@ efifb_list_font(void *v, struct wsdispla
}
void
-efifb_scrollback(void *v, void *cookie, int lines)
+efifb_scrollback(void *v, void *cookie, int lines, long attr)
{
struct efifb_softc *sc = v;
struct rasops_info *ri = &sc->sc_fb->rinfo;
- rasops_scrollback(ri, cookie, lines);
+ rasops_scrollback(ri, cookie, lines, attr);
}
int