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++;
+    }
+}

Reply via email to