Module Name: src Committed By: macallan Date: Fri Aug 7 23:31:07 UTC 2020
Modified Files: src/sys/dev/pci: machfb.c Log Message: the drawing engine needs a stride that's a multiple of 8 in pixels, so let's actually distinguish between width and stride, and always round the stride up to the next multiple of 8 now modes with odd widths work To generate a diff of this commit: cvs rdiff -u -r1.101 -r1.102 src/sys/dev/pci/machfb.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/dev/pci/machfb.c diff -u src/sys/dev/pci/machfb.c:1.101 src/sys/dev/pci/machfb.c:1.102 --- src/sys/dev/pci/machfb.c:1.101 Fri Aug 7 18:26:33 2020 +++ src/sys/dev/pci/machfb.c Fri Aug 7 23:31:07 2020 @@ -1,4 +1,4 @@ -/* $NetBSD: machfb.c,v 1.101 2020/08/07 18:26:33 jdc Exp $ */ +/* $NetBSD: machfb.c,v 1.102 2020/08/07 23:31:07 macallan Exp $ */ /* * Copyright (c) 2002 Bang Jun-Young @@ -34,7 +34,7 @@ #include <sys/cdefs.h> __KERNEL_RCSID(0, - "$NetBSD: machfb.c,v 1.101 2020/08/07 18:26:33 jdc Exp $"); + "$NetBSD: machfb.c,v 1.102 2020/08/07 23:31:07 macallan Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -126,6 +126,7 @@ struct mach64_softc { int max_y; int virt_x; int virt_y; + int stride; /* in pixels */ int color_depth; int mem_freq; @@ -690,9 +691,10 @@ mach64_attach(device_t parent, device_t sc->bits_per_pixel = 8; sc->virt_x = sc->sc_my_mode->hdisplay; sc->virt_y = sc->sc_my_mode->vdisplay; + sc->stride = (sc->virt_x + 7) & ~7; /* hw needs multiples of 8 */ sc->max_x = sc->virt_x - 1; sc->max_y = (sc->memsize * 1024) / - (sc->virt_x * (sc->bits_per_pixel / 8)) - 1; + (sc->stride * (sc->bits_per_pixel / 8)) - 1; sc->color_depth = CRTC_PIX_WIDTH_8BPP; @@ -734,9 +736,9 @@ mach64_attach(device_t parent, device_t mach64_defaultscreen.nrows = ri->ri_rows; mach64_defaultscreen.ncols = ri->ri_cols; glyphcache_init(&sc->sc_gc, sc->sc_my_mode->vdisplay + 5, - ((sc->memsize * 1024) / sc->sc_my_mode->hdisplay) - + ((sc->memsize * 1024) / sc->stride) - sc->sc_my_mode->vdisplay - 5, - sc->sc_my_mode->hdisplay, + sc->stride, ri->ri_font->fontwidth, ri->ri_font->fontheight, defattr); @@ -754,9 +756,9 @@ mach64_attach(device_t parent, device_t (*ri->ri_ops.allocattr)(ri, 0, 0, 0, &defattr); glyphcache_init(&sc->sc_gc, sc->sc_my_mode->vdisplay + 5, - ((sc->memsize * 1024) / sc->sc_my_mode->hdisplay) - + ((sc->memsize * 1024) / sc->stride) - sc->sc_my_mode->vdisplay - 5, - sc->sc_my_mode->hdisplay, + sc->stride, ri->ri_font->fontwidth, ri->ri_font->fontheight, defattr); @@ -818,7 +820,7 @@ mach64_init_screen(void *cookie, struct ri->ri_depth = sc->bits_per_pixel; ri->ri_width = sc->sc_my_mode->hdisplay; ri->ri_height = sc->sc_my_mode->vdisplay; - ri->ri_stride = ri->ri_width; + ri->ri_stride = sc->stride; ri->ri_flg = RI_CENTER | RI_FULLCLEAR; if (ri->ri_depth == 8) ri->ri_flg |= RI_8BIT_IS_RGB | RI_ENABLE_ALPHA | @@ -1083,7 +1085,7 @@ mach64_set_crtcregs(struct mach64_softc regw(sc, CRTC_VLINE_CRNT_VLINE, 0); - regw(sc, CRTC_OFF_PITCH, (sc->virt_x >> 3) << 22); + regw(sc, CRTC_OFF_PITCH, (sc->stride >> 3) << 22); regw(sc, CRTC_GEN_CNTL, crtc->gen_cntl | crtc->color_depth | sc->sc_gen_cntl | CRTC_EXT_DISP_EN | CRTC_EXT_EN); @@ -1129,7 +1131,7 @@ mach64_init_engine(struct mach64_softc * { uint32_t pitch_value; - pitch_value = sc->virt_x; + pitch_value = sc->stride; if (sc->bits_per_pixel == 24) pitch_value *= 3; @@ -1143,7 +1145,7 @@ mach64_init_engine(struct mach64_softc * regw(sc, DST_OFF_PITCH, (pitch_value >> 3) << 22); /* make sure the visible area starts where we're going to draw */ - regw(sc, CRTC_OFF_PITCH, (sc->virt_x >> 3) << 22); + regw(sc, CRTC_OFF_PITCH, (sc->stride >> 3) << 22); regw(sc, DST_Y_X, 0); regw(sc, DST_HEIGHT, 0); @@ -1216,7 +1218,7 @@ mach64_adjust_frame(struct mach64_softc { int offset; - offset = ((x + y * sc->virt_x) * (sc->bits_per_pixel >> 3)) >> 3; + offset = ((x + y * sc->stride) * (sc->bits_per_pixel >> 3)) >> 3; regw(sc, CRTC_OFF_PITCH, (regr(sc, CRTC_OFF_PITCH) & 0xfff00000) | offset); @@ -1921,7 +1923,7 @@ mach64_ioctl(void *v, void *vs, u_long c return 0; case WSDISPLAYIO_LINEBYTES: - *(u_int *)data = sc->virt_x * sc->bits_per_pixel / 8; + *(u_int *)data = sc->stride * sc->bits_per_pixel / 8; return 0; case WSDISPLAYIO_GINFO: