Module Name: xsrc Committed By: jandberg Date: Mon Mar 25 14:11:39 UTC 2024
Modified Files: xsrc/external/mit/xf86-video-wsfb/dist/src: wsfb_driver.c xsrc/external/mit/xorg-server/dist/miext/shadow: shadow.h shafb4.c Log Message: xf86-video-wsfb: Add support for 16 color mode on Amiga - Sets up 8bpp shadow framebuffer with depth 4 - Bitplane conversion done in shadow update function - Adds new shadow update function shadowUpdateAfb4x8, which is a slightly modified version of existing shadowUpdateAfb4/8. Discussion on tech-x11: http://mail-index.netbsd.org/tech-x11/2024/02/29/msg002447.html To generate a diff of this commit: cvs rdiff -u -r1.49 -r1.50 \ xsrc/external/mit/xf86-video-wsfb/dist/src/wsfb_driver.c cvs rdiff -u -r1.1.1.5 -r1.2 \ xsrc/external/mit/xorg-server/dist/miext/shadow/shadow.h cvs rdiff -u -r1.1.1.2 -r1.2 \ xsrc/external/mit/xorg-server/dist/miext/shadow/shafb4.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.49 xsrc/external/mit/xf86-video-wsfb/dist/src/wsfb_driver.c:1.50 --- xsrc/external/mit/xf86-video-wsfb/dist/src/wsfb_driver.c:1.49 Fri Jan 26 13:37:21 2024 +++ xsrc/external/mit/xf86-video-wsfb/dist/src/wsfb_driver.c Mon Mar 25 14:11:39 2024 @@ -554,14 +554,20 @@ WsfbPreInit(ScrnInfoPtr pScrn, int flags if (wstype == WSDISPLAY_TYPE_AMIGACC) { /* * Video memory is organized in bitplanes. - * 8bpp or 1bpp supported in this driver. - * With 8bpp conversion to bitplane format - * is done in shadow update proc. + * 8bpp, 4bpp, and 1bpp supported in this driver. + * With 8bpp/4bpp conversion to bitplane format + * is done in shadow update proc. In both cases + * shadow fb uses 8bpp memory layout and shadow + * update proc ignores the possible extra bits. * With 1bpp no conversion needed. */ #ifdef HAVE_SHADOW_AFB if (bitsperpixel == 8) { fPtr->planarAfb = TRUE; + } else if (bitsperpixel == 4) { + fPtr->planarAfb = TRUE; + default_depth = 4; + bitsperpixel = 8; } else #endif { @@ -643,6 +649,16 @@ WsfbPreInit(ScrnInfoPtr pScrn, int flags fPtr->fbi.fbi_pixeltype = WSFB_RGB; } #endif +#ifdef HAVE_SHADOW_AFB + if (fPtr->planarAfb) + { + if (!fPtr->shadowFB) { + xf86DrvMsg(pScrn->scrnIndex, X_WARNING, + "Shadow FB forced on for planar framebuffer\n"); + fPtr->shadowFB = TRUE; + } + } +#endif /* Rotation */ fPtr->rotate = WSFB_ROTATE_NONE; if ((s = xf86GetOptValString(fPtr->Options, OPTION_ROTATE))) { @@ -891,9 +907,12 @@ WsfbCreateScreenResources(ScreenPtr pScr shadowproc = wsfbUpdateRotatePacked; } else #ifdef HAVE_SHADOW_AFB - if (fPtr->planarAfb) { + if (fPtr->planarAfb && fPtr->fbi.fbi_bitsperpixel == 8) { shadowproc = shadowUpdateAfb8; windowproc = WsfbWindowAfb; + } else if (fPtr->planarAfb && fPtr->fbi.fbi_bitsperpixel == 4) { + shadowproc = shadowUpdateAfb4x8; + windowproc = WsfbWindowAfb; } else #endif { Index: xsrc/external/mit/xorg-server/dist/miext/shadow/shadow.h diff -u xsrc/external/mit/xorg-server/dist/miext/shadow/shadow.h:1.1.1.5 xsrc/external/mit/xorg-server/dist/miext/shadow/shadow.h:1.2 --- xsrc/external/mit/xorg-server/dist/miext/shadow/shadow.h:1.1.1.5 Mon Dec 31 09:36:07 2018 +++ xsrc/external/mit/xorg-server/dist/miext/shadow/shadow.h Mon Mar 25 14:11:39 2024 @@ -88,6 +88,9 @@ extern _X_EXPORT void shadowUpdateAfb8(ScreenPtr pScreen, shadowBufPtr pBuf); extern _X_EXPORT void + shadowUpdateAfb4x8(ScreenPtr pScreen, shadowBufPtr pBuf); + +extern _X_EXPORT void shadowUpdateIplan2p4(ScreenPtr pScreen, shadowBufPtr pBuf); extern _X_EXPORT void Index: xsrc/external/mit/xorg-server/dist/miext/shadow/shafb4.c diff -u xsrc/external/mit/xorg-server/dist/miext/shadow/shafb4.c:1.1.1.2 xsrc/external/mit/xorg-server/dist/miext/shadow/shafb4.c:1.2 --- xsrc/external/mit/xorg-server/dist/miext/shadow/shafb4.c:1.1.1.2 Mon Dec 31 09:36:07 2018 +++ xsrc/external/mit/xorg-server/dist/miext/shadow/shafb4.c Mon Mar 25 14:11:39 2024 @@ -137,3 +137,70 @@ shadowUpdateAfb4(ScreenPtr pScreen, shad pbox++; } } + + /* + * Like above, except input is 8-bit chunky pixels (upper 4 bits zero) + */ +void +shadowUpdateAfb4x8(ScreenPtr pScreen, shadowBufPtr pBuf) +{ + RegionPtr damage = DamageRegion(pBuf->pDamage); + PixmapPtr pShadow = pBuf->pPixmap; + int nbox = RegionNumRects(damage); + BoxPtr pbox = RegionRects(damage); + FbBits *shaBase; + CARD32 *shaLine, *sha; + FbStride shaStride; + int scrLine; + _X_UNUSED int shaBpp, shaXoff, shaYoff; + int x, y, w, h; + int i, n; + CARD32 *win; + CARD32 off, winStride; + CARD32 dwords[4]; + + fbGetDrawable(&pShadow->drawable, shaBase, shaStride, shaBpp, shaXoff, + shaYoff); + if (sizeof(FbBits) != sizeof(CARD32)) + shaStride = shaStride * sizeof(FbBits) / sizeof(CARD32); + + while (nbox--) { + x = pbox->x1; + y = pbox->y1; + w = pbox->x2 - pbox->x1; + h = pbox->y2 - pbox->y1; + + scrLine = x & -32; + shaLine = (CARD32 *)shaBase + y * shaStride + scrLine / sizeof(CARD32); + + off = scrLine / 8; /* byte offset in bitplane scanline */ + n = ((x & 31) + w + 31) / 32; /* number of c2p units in scanline */ + + while (h--) { + sha = shaLine; + win = (CARD32 *) (*pBuf->window) (pScreen, + y, + off, + SHADOW_WINDOW_WRITE, + &winStride, + pBuf->closure); + if (!win) + return; + for (i = 0; i < n; i++) { + dwords[0] = (sha[0] << 4) | sha[1]; + dwords[2] = (sha[2] << 4) | sha[3]; + dwords[1] = (sha[4] << 4) | sha[5]; + dwords[3] = (sha[6] << 4) | sha[7]; + transp4(dwords, 16, 1); + transp4(dwords, 8, 2); + transp4(dwords, 2, 1); + transp4(dwords, 1, 2); + store_afb4(win++, winStride, dwords); + sha += 8; + } + shaLine += shaStride; + y++; + } + pbox++; + } +}