Module Name: xsrc Committed By: martin Date: Sun Dec 29 09:20:15 UTC 2019
Modified Files: xsrc/external/mit/xf86-video-wsfb/dist/src [netbsd-8]: wsfb_driver.c Log Message: Pull up following revision(s) (requested by tsutsui in ticket #1479): external/mit/xf86-video-wsfb/dist/src/wsfb_driver.c: revision 1.36 Fix Xorg wsfb server "Rotate" corruption problem. PR xsrc/54167 Confirmed on zaurus SL-C1000, SL-C3000 (CW) and hpcarm WS003SH (CCW). Should be pulled up to netbsd-8 and netbsd-9. To generate a diff of this commit: cvs rdiff -u -r1.29 -r1.29.2.1 \ 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.29 xsrc/external/mit/xf86-video-wsfb/dist/src/wsfb_driver.c:1.29.2.1 --- xsrc/external/mit/xf86-video-wsfb/dist/src/wsfb_driver.c:1.29 Fri Mar 24 00:57:33 2017 +++ xsrc/external/mit/xf86-video-wsfb/dist/src/wsfb_driver.c Sun Dec 29 09:20:15 2019 @@ -858,6 +858,7 @@ WsfbScreenInit(SCREEN_INIT_ARGS_DECL) int ret, flags, ncolors; int wsmode = WSDISPLAYIO_MODE_DUMBFB; int wstype; + int width; size_t len; TRACE_ENTER("WsfbScreenInit"); @@ -972,7 +973,17 @@ WsfbScreenInit(SCREEN_INIT_ARGS_DECL) #endif if (fPtr->shadowFB) { - fPtr->shadow = calloc(1, fPtr->fbi.fbi_stride * pScrn->virtualY); + if (fPtr->rotate) { + /* + * Note Rotate and Shadow FB options are valid + * only on depth >= 8. + */ + len = pScrn->virtualX * pScrn->virtualY * + (pScrn->bitsPerPixel >> 3); + } else { + len = fPtr->fbi.fbi_stride * pScrn->virtualY; + } + fPtr->shadow = calloc(1, len); if (!fPtr->shadow) { xf86DrvMsg(pScrn->scrnIndex, X_ERROR, @@ -981,13 +992,29 @@ WsfbScreenInit(SCREEN_INIT_ARGS_DECL) } } + /* + * fbScreenInit() seems to require "pixel width of frame buffer" + * but it is actually "stride in pixel" of frame buffer, + * per xorg/xserver/tree/fb/fbscreen.c. + */ + if (fPtr->rotate) { + width = pScrn->displayWidth; + } else { + if (pScrn->bitsPerPixel > 8) { + width = + fPtr->fbi.fbi_stride / (pScrn->bitsPerPixel >> 3); + } else { + width = + fPtr->fbi.fbi_stride * (8 / pScrn->bitsPerPixel); + } + } switch (pScrn->bitsPerPixel) { case 1: ret = fbScreenInit(pScreen, fPtr->fbstart, pScrn->virtualX, pScrn->virtualY, pScrn->xDpi, pScrn->yDpi, - fPtr->fbi.fbi_stride * 8, pScrn->bitsPerPixel); + width, pScrn->bitsPerPixel); break; case 4: case 8: @@ -998,8 +1025,7 @@ WsfbScreenInit(SCREEN_INIT_ARGS_DECL) fPtr->shadowFB ? fPtr->shadow : fPtr->fbstart, pScrn->virtualX, pScrn->virtualY, pScrn->xDpi, pScrn->yDpi, - /* apparently fb wants stride in pixels, not bytes */ - fPtr->fbi.fbi_stride / (pScrn->bitsPerPixel >> 3), + width, pScrn->bitsPerPixel); break; default: