Module Name: xsrc Committed By: riz Date: Thu Feb 14 21:44:11 UTC 2013
Modified Files: xsrc/external/mit/xf86-video-wsfb/dist/src [netbsd-6]: wsfb_driver.c Log Message: Pull up revision 1.15 as the second part of a fix for ticket 818. To generate a diff of this commit: cvs rdiff -u -r1.13.2.1 -r1.13.2.2 \ 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.1 xsrc/external/mit/xf86-video-wsfb/dist/src/wsfb_driver.c:1.13.2.2 --- xsrc/external/mit/xf86-video-wsfb/dist/src/wsfb_driver.c:1.13.2.1 Wed Feb 13 20:52:41 2013 +++ xsrc/external/mit/xf86-video-wsfb/dist/src/wsfb_driver.c Thu Feb 14 21:44:11 2013 @@ -438,48 +438,96 @@ WsfbPreInit(ScrnInfoPtr pScrn, int flags return FALSE; } - if (ioctl(fPtr->fd, WSDISPLAYIO_GINFO, &fPtr->info) == -1) { - xf86DrvMsg(pScrn->scrnIndex, X_ERROR, - "ioctl WSDISPLAY_GINFO: %s\n", - strerror(errno)); - return FALSE; - } - if (ioctl(fPtr->fd, WSDISPLAYIO_GTYPE, &wstype) == -1) { - xf86DrvMsg(pScrn->scrnIndex, X_ERROR, - "ioctl WSDISPLAY_GTYPE: %s\n", - strerror(errno)); - return FALSE; - } - if (ioctl(fPtr->fd, WSDISPLAYIO_LINEBYTES, &fPtr->linebytes) == -1) { - xf86DrvMsg(pScrn->scrnIndex, X_ERROR, - "ioctl WSDISPLAYIO_LINEBYTES: %s\n", - strerror(errno)); - return FALSE; + if (ioctl(fPtr->fd, WSDISPLAYIO_GET_FBINFO, &fPtr->fbi) != 0) { + struct wsdisplay_fbinfo info; + struct wsdisplayio_fbinfo *fbi = &fPtr->fbi; + int lb; + + xf86Msg(X_WARNING, "ioctl(WSDISPLAYIO_GET_FBINFO) failed, " \ + "falling back to old method\n"); + if (ioctl(fPtr->fd, WSDISPLAYIO_GINFO, &info) == -1) { + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, + "ioctl WSDISPLAY_GINFO: %s\n", + strerror(errno)); + return FALSE; + } + if (ioctl(fPtr->fd, WSDISPLAYIO_GTYPE, &wstype) == -1) { + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, + "ioctl WSDISPLAY_GTYPE: %s\n", + strerror(errno)); + return FALSE; + } + if (ioctl(fPtr->fd, WSDISPLAYIO_LINEBYTES, &lb) == -1) { + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, + "ioctl WSDISPLAYIO_LINEBYTES: %s\n", + strerror(errno)); + return FALSE; + } + /* ok, fake up a new style fbinfo */ + fbi->fbi_width = info.width; + fbi->fbi_height = info.height; + fbi->fbi_stride = lb; + fbi->fbi_bitsperpixel = info.depth; + if (info.depth > 16) { + fbi->fbi_pixeltype = WSFB_RGB; + if (wstype == WSDISPLAY_TYPE_SUN24 || + wstype == WSDISPLAY_TYPE_SUNCG12 || + wstype == WSDISPLAY_TYPE_SUNCG14 || + wstype == WSDISPLAY_TYPE_SUNTCX || + wstype == WSDISPLAY_TYPE_SUNFFB || + wstype == WSDISPLAY_TYPE_XVR1000 || + wstype == WSDISPLAY_TYPE_VC4) { + fbi->fbi_subtype.fbi_rgbmasks.red_offset = 0; + fbi->fbi_subtype.fbi_rgbmasks.red_size = 8; + fbi->fbi_subtype.fbi_rgbmasks.green_offset = 8; + fbi->fbi_subtype.fbi_rgbmasks.green_size = 8; + fbi->fbi_subtype.fbi_rgbmasks.blue_offset = 16; + fbi->fbi_subtype.fbi_rgbmasks.blue_size = 8; + } else { + fbi->fbi_subtype.fbi_rgbmasks.red_offset = 16; + fbi->fbi_subtype.fbi_rgbmasks.red_size = 8; + fbi->fbi_subtype.fbi_rgbmasks.green_offset = 8; + fbi->fbi_subtype.fbi_rgbmasks.green_size = 8; + fbi->fbi_subtype.fbi_rgbmasks.blue_offset = 0; + fbi->fbi_subtype.fbi_rgbmasks.blue_size = 8; + } + fbi->fbi_subtype.fbi_rgbmasks.alpha_offset = 0; + fbi->fbi_subtype.fbi_rgbmasks.alpha_size = 0; + } else if (info.depth <= 8) { + fbi->fbi_pixeltype = WSFB_CI; + fbi->fbi_subtype.fbi_cmapinfo.cmap_entries = info.cmsize; + } + fbi->fbi_flags = 0; + fbi->fbi_fbsize = info.width * lb; + } /* * Allocate room for saving the colormap. */ - if (fPtr->info.cmsize != 0) { + if (fPtr->fbi.fbi_pixeltype == WSFB_CI) { fPtr->saved_cmap.red = - (unsigned char *)xalloc(fPtr->info.cmsize); + (unsigned char *)xalloc(fPtr->fbi.fbi_subtype.fbi_cmapinfo.cmap_entries); if (fPtr->saved_cmap.red == NULL) { xf86DrvMsg(pScrn->scrnIndex, X_ERROR, - "Cannot malloc %d bytes\n", fPtr->info.cmsize); + "Cannot malloc %d bytes\n", + fPtr->fbi.fbi_subtype.fbi_cmapinfo.cmap_entries); return FALSE; } fPtr->saved_cmap.green = - (unsigned char *)xalloc(fPtr->info.cmsize); + (unsigned char *)xalloc(fPtr->fbi.fbi_subtype.fbi_cmapinfo.cmap_entries); if (fPtr->saved_cmap.green == NULL) { xf86DrvMsg(pScrn->scrnIndex, X_ERROR, - "Cannot malloc %d bytes\n", fPtr->info.cmsize); + "Cannot malloc %d bytes\n", + fPtr->fbi.fbi_subtype.fbi_cmapinfo.cmap_entries); xfree(fPtr->saved_cmap.red); return FALSE; } fPtr->saved_cmap.blue = - (unsigned char *)xalloc(fPtr->info.cmsize); + (unsigned char *)xalloc(fPtr->fbi.fbi_subtype.fbi_cmapinfo.cmap_entries); if (fPtr->saved_cmap.blue == NULL) { xf86DrvMsg(pScrn->scrnIndex, X_ERROR, - "Cannot malloc %d bytes\n", fPtr->info.cmsize); + "Cannot malloc %d bytes\n", + fPtr->fbi.fbi_subtype.fbi_cmapinfo.cmap_entries); xfree(fPtr->saved_cmap.red); xfree(fPtr->saved_cmap.green); return FALSE; @@ -487,18 +535,18 @@ WsfbPreInit(ScrnInfoPtr pScrn, int flags } /* Handle depth */ - default_depth = fPtr->info.depth <= 24 ? fPtr->info.depth : 24; + default_depth = fPtr->fbi.fbi_bitsperpixel <= 24 ? fPtr->fbi.fbi_bitsperpixel : 24; if (!xf86SetDepthBpp(pScrn, default_depth, default_depth, - fPtr->info.depth, - fPtr->info.depth >= 24 ? Support24bppFb|Support32bppFb : 0)) + fPtr->fbi.fbi_bitsperpixel, + fPtr->fbi.fbi_bitsperpixel >= 24 ? Support24bppFb|Support32bppFb : 0)) return FALSE; /* Check consistency. */ - if (pScrn->bitsPerPixel != fPtr->info.depth) { + if (pScrn->bitsPerPixel != fPtr->fbi.fbi_bitsperpixel) { xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "specified depth (%d) or bpp (%d) doesn't match " "framebuffer depth (%d)\n", pScrn->depth, - pScrn->bitsPerPixel, fPtr->info.depth); + pScrn->bitsPerPixel, fPtr->fbi.fbi_bitsperpixel); return FALSE; } xf86PrintDepthBpp(pScrn); @@ -508,19 +556,28 @@ WsfbPreInit(ScrnInfoPtr pScrn, int flags pix24bpp = xf86GetBppFromDepth(pScrn, 24); /* Color weight */ - if (pScrn->depth > 8) { + if (fPtr->fbi.fbi_pixeltype == WSFB_RGB) { rgb zeros = { 0, 0, 0 }, masks; - if (wstype == WSDISPLAY_TYPE_SUN24 || - wstype == WSDISPLAY_TYPE_SUNCG12 || - wstype == WSDISPLAY_TYPE_SUNCG14 || - wstype == WSDISPLAY_TYPE_SUNTCX || - wstype == WSDISPLAY_TYPE_SUNFFB || - wstype == WSDISPLAY_TYPE_XVR1000 || - wstype == WSDISPLAY_TYPE_VC4) { - masks.red = 0x0000ff; - masks.green = 0x00ff00; - masks.blue = 0xff0000; + if (fPtr->fbi.fbi_subtype.fbi_rgbmasks.red_size > 0) { + uint32_t msk; + + msk = 0xffffffff; + msk = msk << fPtr->fbi.fbi_subtype.fbi_rgbmasks.red_size; + msk = ~msk; + masks.red = msk << fPtr->fbi.fbi_subtype.fbi_rgbmasks.red_offset; + + msk = 0xffffffff; + msk = msk << fPtr->fbi.fbi_subtype.fbi_rgbmasks.green_size; + msk = ~msk; + masks.green = msk << fPtr->fbi.fbi_subtype.fbi_rgbmasks.green_offset; + + msk = 0xffffffff; + msk = msk << fPtr->fbi.fbi_subtype.fbi_rgbmasks.blue_size; + msk = ~msk; + masks.blue = msk << fPtr->fbi.fbi_subtype.fbi_rgbmasks.blue_offset; + xf86Msg(X_INFO, "masks generated: %08x %08x %08x\n", + masks.red, masks.green, masks.blue); } else { masks.red = 0; masks.green = 0; @@ -549,7 +606,7 @@ WsfbPreInit(ScrnInfoPtr pScrn, int flags pScrn->progClock = TRUE; pScrn->rgbBits = (pScrn->depth >= 8) ? 8 : pScrn->depth; pScrn->chipset = "wsfb"; - pScrn->videoRam = fPtr->linebytes * fPtr->info.height; + pScrn->videoRam = fPtr->fbi.fbi_fbsize; xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Vidmem: %dk\n", pScrn->videoRam/1024); @@ -563,10 +620,12 @@ WsfbPreInit(ScrnInfoPtr pScrn, int flags fPtr->Options); /* Use shadow framebuffer by default, on depth >= 8 */ - if (pScrn->depth >= 8) + xf86Msg(X_INFO, "fbi_flags: %x\n", fPtr->fbi.fbi_flags); + if ((pScrn->depth >= 8) && + ((fPtr->fbi.fbi_flags & WSFB_VRAM_IS_RAM) == 0)) { fPtr->shadowFB = xf86ReturnOptValBool(fPtr->Options, OPTION_SHADOW_FB, TRUE); - else + } else if (xf86ReturnOptValBool(fPtr->Options, OPTION_SHADOW_FB, FALSE)) { xf86DrvMsg(pScrn->scrnIndex, X_WARNING, @@ -614,12 +673,12 @@ WsfbPreInit(ScrnInfoPtr pScrn, int flags mode->status = MODE_OK; mode->type = M_T_BUILTIN; mode->Clock = 0; - mode->HDisplay = fPtr->info.width; + mode->HDisplay = fPtr->fbi.fbi_width; mode->HSyncStart = 0; mode->HSyncEnd = 0; mode->HTotal = 0; mode->HSkew = 0; - mode->VDisplay = fPtr->info.height; + mode->VDisplay = fPtr->fbi.fbi_height; mode->VSyncStart = 0; mode->VSyncEnd = 0; mode->VTotal = 0; @@ -630,8 +689,8 @@ WsfbPreInit(ScrnInfoPtr pScrn, int flags "Ignoring mode specification from screen section\n"); } pScrn->currentMode = pScrn->modes = mode; - pScrn->virtualX = fPtr->info.width; - pScrn->virtualY = fPtr->info.height; + pScrn->virtualX = fPtr->fbi.fbi_width; + pScrn->virtualY = fPtr->fbi.fbi_height; pScrn->displayWidth = pScrn->virtualX; /* Set the display resolution. */ @@ -750,36 +809,39 @@ WsfbScreenInit(int scrnIndex, ScreenPtr pScrn->mask.red,pScrn->mask.green,pScrn->mask.blue, pScrn->offset.red,pScrn->offset.green,pScrn->offset.blue); #endif - switch (fPtr->info.depth) { + switch (fPtr->fbi.fbi_bitsperpixel) { case 1: case 4: case 8: - len = fPtr->linebytes*fPtr->info.height; + len = fPtr->fbi.fbi_stride * fPtr->fbi.fbi_height; break; case 16: - if (fPtr->linebytes == fPtr->info.width) { - len = fPtr->info.width*fPtr->info.height*sizeof(short); + if (fPtr->fbi.fbi_stride == fPtr->fbi.fbi_width) { + xf86Msg(X_ERROR, "Bogus stride == width in 16bit colour\n"); + len = fPtr->fbi.fbi_width * fPtr->fbi.fbi_height * sizeof(short); } else { - len = fPtr->linebytes*fPtr->info.height; + len = fPtr->fbi.fbi_stride * fPtr->fbi.fbi_height; } break; case 24: - if (fPtr->linebytes == fPtr->info.width) { - len = fPtr->info.width*fPtr->info.height*3; + if (fPtr->fbi.fbi_stride == fPtr->fbi.fbi_width) { + xf86Msg(X_ERROR, "Bogus stride == width in 24bit colour\n"); + len = fPtr->fbi.fbi_width * fPtr->fbi.fbi_height * 3; } else { - len = fPtr->linebytes*fPtr->info.height; + len = fPtr->fbi.fbi_stride * fPtr->fbi.fbi_height; } break; case 32: - if (fPtr->linebytes == fPtr->info.width) { - len = fPtr->info.width*fPtr->info.height*sizeof(int); + if (fPtr->fbi.fbi_stride == fPtr->fbi.fbi_width) { + xf86Msg(X_ERROR, "Bogus stride == width in 32bit colour\n"); + len = fPtr->fbi.fbi_width * fPtr->fbi.fbi_height * sizeof(int); } else { - len = fPtr->linebytes*fPtr->info.height; + len = fPtr->fbi.fbi_stride * fPtr->fbi.fbi_height; } break; default: xf86DrvMsg(pScrn->scrnIndex, X_ERROR, - "unsupported depth %d\n", fPtr->info.depth); + "unsupported depth %d\n", fPtr->fbi.fbi_bitsperpixel); return FALSE; } /* Switch to graphics mode - required before mmap. */ @@ -864,7 +926,7 @@ WsfbScreenInit(int scrnIndex, ScreenPtr fPtr->fbstart, pScrn->virtualX, pScrn->virtualY, pScrn->xDpi, pScrn->yDpi, - fPtr->linebytes * 8, pScrn->bitsPerPixel); + fPtr->fbi.fbi_stride * 8, pScrn->bitsPerPixel); break; case 4: case 8: @@ -950,10 +1012,16 @@ WsfbScreenInit(int scrnIndex, ScreenPtr if (!miCreateDefColormap(pScreen)) return FALSE; flags = CMAP_RELOAD_ON_MODE_SWITCH; - ncolors = fPtr->info.cmsize; + + ncolors = 0; + if (fPtr->fbi.fbi_pixeltype == WSFB_CI) { + ncolors = fPtr->fbi.fbi_subtype.fbi_cmapinfo.cmap_entries; + } + /* On StaticGray visuals, fake a 256 entries colormap. */ if (ncolors == 0) ncolors = 256; + if(!xf86HandleColormaps(pScreen, ncolors, 8, WsfbLoadPalette, NULL, flags)) return FALSE; @@ -1023,14 +1091,18 @@ WsfbWindowLinear(ScreenPtr pScreen, CARD ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; WsfbPtr fPtr = WSFBPTR(pScrn); - if (fPtr->linebytes) - *size = fPtr->linebytes; + /* + * XXX + * This should never happen. Is it really necessary? + */ + if (fPtr->fbi.fbi_stride) + *size = fPtr->fbi.fbi_stride; else { if (ioctl(fPtr->fd, WSDISPLAYIO_LINEBYTES, size) == -1) return NULL; - fPtr->linebytes = *size; + fPtr->fbi.fbi_stride = *size; } - return ((CARD8 *)fPtr->fbmem + row *fPtr->linebytes + offset); + return ((CARD8 *)fPtr->fbmem + row * fPtr->fbi.fbi_stride + offset); } static void @@ -1201,11 +1273,12 @@ WsfbSave(ScrnInfoPtr pScrn) TRACE_ENTER("WsfbSave"); - if (fPtr->info.cmsize == 0) + /* nothing to save if we don't run in colour-indexed mode */ + if (fPtr->fbi.fbi_pixeltype != WSFB_CI) return; fPtr->saved_cmap.index = 0; - fPtr->saved_cmap.count = fPtr->info.cmsize; + fPtr->saved_cmap.count = fPtr->fbi.fbi_subtype.fbi_cmapinfo.cmap_entries; if (ioctl(fPtr->fd, WSDISPLAYIO_GETCMAP, &(fPtr->saved_cmap)) == -1) { xf86DrvMsg(pScrn->scrnIndex, X_ERROR, @@ -1223,7 +1296,7 @@ WsfbRestore(ScrnInfoPtr pScrn) TRACE_ENTER("WsfbRestore"); - if (fPtr->info.cmsize != 0) { + if (fPtr->fbi.fbi_pixeltype == WSFB_CI) { /* reset colormap for text mode */ if (ioctl(fPtr->fd, WSDISPLAYIO_PUTCMAP, &(fPtr->saved_cmap)) == -1) { @@ -1347,12 +1420,12 @@ WsfbDGAAddModes(ScrnInfoPtr pScrn) pDGAMode->viewportWidth = pMode->HDisplay; pDGAMode->viewportHeight = pMode->VDisplay; - if (fPtr->linebytes) - pDGAMode->bytesPerScanline = fPtr->linebytes; + if (fPtr->fbi.fbi_stride) + pDGAMode->bytesPerScanline = fPtr->fbi.fbi_stride; else { ioctl(fPtr->fd, WSDISPLAYIO_LINEBYTES, - &fPtr->linebytes); - pDGAMode->bytesPerScanline = fPtr->linebytes; + &fPtr->fbi.fbi_stride); + pDGAMode->bytesPerScanline = fPtr->fbi.fbi_stride; } pDGAMode->imageWidth = pMode->HDisplay;