Module Name: xsrc
Committed By: martin
Date: Sun Dec 29 09:23:04 UTC 2019
Modified Files:
xsrc/external/mit/xf86-video-wsfb/dist/src [netbsd-9]: wsfb_driver.c
Log Message:
Pull up following revision(s) (requested by tsutsui in ticket #585):
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.35 -r1.35.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.35 xsrc/external/mit/xf86-video-wsfb/dist/src/wsfb_driver.c:1.35.2.1
--- xsrc/external/mit/xf86-video-wsfb/dist/src/wsfb_driver.c:1.35 Tue Jul 23 12:01:53 2019
+++ xsrc/external/mit/xf86-video-wsfb/dist/src/wsfb_driver.c Sun Dec 29 09:23:04 2019
@@ -875,6 +875,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");
@@ -979,7 +980,17 @@ WsfbScreenInit(SCREEN_INIT_ARGS_DECL)
fPtr->fbstart = fPtr->fbmem + fPtr->fbi.fbi_fboffset;
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,
@@ -988,13 +999,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:
@@ -1005,8 +1032,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: