Module Name: xsrc Committed By: msaitoh Date: Sun Nov 9 07:40:31 UTC 2014
Modified Files: xsrc/external/mit/xf86-video-wsfb/dist/src [netbsd-6]: wsfb_driver.c Log Message: Pull up following revision(s) (requested by tsutsui in ticket #1183): external/mit/xf86-video-wsfb/dist/src/wsfb_driver.c: revision 1.22 external/mit/xf86-video-wsfb/dist/src/wsfb_driver.c: revision 1.23 external/mit/xf86-video-wsfb/dist/src/wsfb_driver.c: revision 1.25 Fix wrong VRAM size calculation on old drivers without GET_FBINFO ioctl. The linebytes is a byte number of width so it should be (linebytes * height), not (width * linebytes). XXX: I'm not sure where WSDISPLAYIO_GET_FBINFO implementation was discussed but I wonder if we should use proper ifdef or macro to share this third party Xorg driver with OpenBSD... No need to handle colormap ioctls if cmsize == 0 even in WSFB_CI case. Add kludge to use luna68k 4/8bpp framebuffers as a monochrome server. The idea is taken from mlterm-fb --depth option implementation. This change should not affect other framebuffer types. Tested on 4bpp on LUNA and 1bpp/8bpp on LUNA-II. To generate a diff of this commit: cvs rdiff -u -r1.13.2.3 -r1.13.2.4 \ xsrc/external/mit/xf86-video-wsfb/dist/src/wsfb_driver.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: xsrc/external/mit/xf86-video-wsfb/dist/src/wsfb_driver.c diff -u xsrc/external/mit/xf86-video-wsfb/dist/src/wsfb_driver.c:1.13.2.3 xsrc/external/mit/xf86-video-wsfb/dist/src/wsfb_driver.c:1.13.2.4 --- xsrc/external/mit/xf86-video-wsfb/dist/src/wsfb_driver.c:1.13.2.3 Thu Aug 7 09:07:36 2014 +++ xsrc/external/mit/xf86-video-wsfb/dist/src/wsfb_driver.c Sun Nov 9 07:40:31 2014 @@ -406,7 +406,7 @@ static Bool WsfbPreInit(ScrnInfoPtr pScrn, int flags) { WsfbPtr fPtr; - int default_depth, wstype; + int default_depth, bitsperpixel, wstype; char *dev, *s; char *mod = NULL; const char *reqSym = NULL; @@ -498,13 +498,14 @@ WsfbPreInit(ScrnInfoPtr pScrn, int flags fbi->fbi_subtype.fbi_cmapinfo.cmap_entries = info.cmsize; } fbi->fbi_flags = 0; - fbi->fbi_fbsize = info.width * lb; + fbi->fbi_fbsize = lb * info.height; } /* * Allocate room for saving the colormap. */ - if (fPtr->fbi.fbi_pixeltype == WSFB_CI) { + if (fPtr->fbi.fbi_pixeltype == WSFB_CI && + fPtr->fbi.fbi_subtype.fbi_cmapinfo.cmap_entries > 0) { fPtr->saved_cmap.red = (unsigned char *)xalloc(fPtr->fbi.fbi_subtype.fbi_cmapinfo.cmap_entries); if (fPtr->saved_cmap.red == NULL) { @@ -536,17 +537,34 @@ WsfbPreInit(ScrnInfoPtr pScrn, int flags /* Handle depth */ default_depth = fPtr->fbi.fbi_bitsperpixel <= 24 ? fPtr->fbi.fbi_bitsperpixel : 24; + bitsperpixel = fPtr->fbi.fbi_bitsperpixel; +#if defined(__NetBSD__) && defined(WSDISPLAY_TYPE_LUNA) + if (wstype == WSDISPLAY_TYPE_LUNA) { + /* + * XXX + * LUNA's color framebuffers support 4bpp or 8bpp + * but they have multiple 1bpp VRAM planes like ancient VGA. + * For now, Xorg server supports only the first one plane + * as 1bpp monochrome server. + * + * Note OpenBSD/luna88k workarounds this by switching depth + * and palette settings by WSDISPLAYIO_SETGFXMODE ioctl. + */ + default_depth = 1; + bitsperpixel = 1; + } +#endif if (!xf86SetDepthBpp(pScrn, default_depth, default_depth, - fPtr->fbi.fbi_bitsperpixel, - fPtr->fbi.fbi_bitsperpixel >= 24 ? Support24bppFb|Support32bppFb : 0)) + bitsperpixel, + bitsperpixel >= 24 ? Support24bppFb|Support32bppFb : 0)) return FALSE; /* Check consistency. */ - if (pScrn->bitsPerPixel != fPtr->fbi.fbi_bitsperpixel) { + if (pScrn->bitsPerPixel != bitsperpixel) { xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "specified depth (%d) or bpp (%d) doesn't match " "framebuffer depth (%d)\n", pScrn->depth, - pScrn->bitsPerPixel, fPtr->fbi.fbi_bitsperpixel); + pScrn->bitsPerPixel, bitsperpixel); return FALSE; } xf86PrintDepthBpp(pScrn); @@ -1026,6 +1044,35 @@ WsfbScreenInit(int scrnIndex, ScreenPtr NULL, flags)) return FALSE; +#if defined(__NetBSD__) && defined(WSDISPLAY_TYPE_LUNA) + if (wstype == WSDISPLAY_TYPE_LUNA) { + ncolors = fPtr->fbi.fbi_subtype.fbi_cmapinfo.cmap_entries; + if (ncolors > 0) { + /* + * Override palette to use 4bpp/8bpp framebuffers as + * monochrome server by using only the first plane. + * See also comment in WsfbPreInit(). + */ + struct wsdisplay_cmap cmap; + uint8_t r[256], g[256], b[256]; + int p; + + for (p = 0; p < ncolors; p++) + r[p] = g[p] = b[p] = (p & 1) ? 0xff : 0; + cmap.index = 0; + cmap.count = ncolors; + cmap.red = r; + cmap.green = g; + cmap.blue = b; + if (ioctl(fPtr->fd, WSDISPLAYIO_PUTCMAP, &cmap) == -1) { + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, + "ioctl WSDISPLAYIO_PUTCMAP: %s\n", + strerror(errno)); + } + } + } +#endif + pScreen->SaveScreen = WsfbSaveScreen; #ifdef XvExtension @@ -1199,6 +1246,10 @@ WsfbLoadPalette(ScrnInfoPtr pScrn, int n TRACE_ENTER("LoadPalette"); + /* nothing to do if there is no color palette support */ + if (fPtr->fbi.fbi_subtype.fbi_cmapinfo.cmap_entries == 0) + return; + cmap.count = 1; cmap.red = red; cmap.green = green; @@ -1278,6 +1329,10 @@ WsfbSave(ScrnInfoPtr pScrn) if (fPtr->fbi.fbi_pixeltype != WSFB_CI) return; + /* nothing to do if no color palette support */ + if (fPtr->fbi.fbi_subtype.fbi_cmapinfo.cmap_entries == 0) + return; + fPtr->saved_cmap.index = 0; fPtr->saved_cmap.count = fPtr->fbi.fbi_subtype.fbi_cmapinfo.cmap_entries; if (ioctl(fPtr->fd, WSDISPLAYIO_GETCMAP, @@ -1297,7 +1352,8 @@ WsfbRestore(ScrnInfoPtr pScrn) TRACE_ENTER("WsfbRestore"); - if (fPtr->fbi.fbi_pixeltype == WSFB_CI) { + if (fPtr->fbi.fbi_pixeltype == WSFB_CI && + fPtr->fbi.fbi_subtype.fbi_cmapinfo.cmap_entries > 0) { /* reset colormap for text mode */ if (ioctl(fPtr->fd, WSDISPLAYIO_PUTCMAP, &(fPtr->saved_cmap)) == -1) {