Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[xsrc/trunk]: xsrc/external/mit/xorg-server/dist/fb Revert upstream "fb: Remo...



details:   https://anonhg.NetBSD.org/xsrc/rev/1840e0267a43
branches:  trunk
changeset: 10540:1840e0267a43
user:      tsutsui <tsutsui%NetBSD.org@localhost>
date:      Sun Aug 09 14:55:26 2020 +0000

description:
Revert upstream "fb: Remove even/odd tile slow-pathing" changes.

https://gitlab.freedesktop.org/xorg/xserver/-/commit/e572bcc7f4236b7e0f23ab762f225b3bce37db59
>> fb: Remove even/odd tile slow-pathing
>>
>> Again, clearly meant to be a fast path, but this turns out not to be the
>> case.

This causes serious performance regression on 1bpp servers.
Ok'ed by mrg@.  See my post on tech-x11@ for more details:
 https://mail-index.netbsd.org/tech-x11/2020/08/07/msg002115.html

diffstat:

 external/mit/xorg-server/dist/fb/fb.h        |   39 ++++++
 external/mit/xorg-server/dist/fb/fbfill.c    |   38 ------
 external/mit/xorg-server/dist/fb/fbtile.c    |  163 +++++++++++++++++++++++++++
 external/mit/xorg-server/dist/fb/wfbrename.h |    3 +
 4 files changed, 205 insertions(+), 38 deletions(-)

diffs (291 lines):

diff -r e55ee8a44270 -r 1840e0267a43 external/mit/xorg-server/dist/fb/fb.h
--- a/external/mit/xorg-server/dist/fb/fb.h     Sun Aug 09 11:51:31 2020 +0000
+++ b/external/mit/xorg-server/dist/fb/fb.h     Sun Aug 09 14:55:26 2020 +0000
@@ -1111,6 +1111,45 @@
 #endif
 
 /*
+ * fbtile.c
+ */
+
+extern _X_EXPORT void
+
+fbEvenTile(FbBits * dst,
+           FbStride dstStride,
+           int dstX,
+           int width,
+           int height,
+           FbBits * tile,
+           FbStride tileStride,
+           int tileHeight, int alu, FbBits pm, int xRot, int yRot);
+
+extern _X_EXPORT void
+
+fbOddTile(FbBits * dst,
+          FbStride dstStride,
+          int dstX,
+          int width,
+          int height,
+          FbBits * tile,
+          FbStride tileStride,
+          int tileWidth,
+          int tileHeight, int alu, FbBits pm, int bpp, int xRot, int yRot);
+
+extern _X_EXPORT void
+
+fbTile(FbBits * dst,
+       FbStride dstStride,
+       int dstX,
+       int width,
+       int height,
+       FbBits * tile,
+       FbStride tileStride,
+       int tileWidth,
+       int tileHeight, int alu, FbBits pm, int bpp, int xRot, int yRot);
+
+/*
  * fbwindow.c
  */
 
diff -r e55ee8a44270 -r 1840e0267a43 external/mit/xorg-server/dist/fb/fbfill.c
--- a/external/mit/xorg-server/dist/fb/fbfill.c Sun Aug 09 11:51:31 2020 +0000
+++ b/external/mit/xorg-server/dist/fb/fbfill.c Sun Aug 09 14:55:26 2020 +0000
@@ -27,44 +27,6 @@
 #include "fb.h"
 
 static void
-fbTile(FbBits * dst, FbStride dstStride, int dstX, int width, int height,
-       FbBits * tile, FbStride tileStride, int tileWidth, int tileHeight,
-       int alu, FbBits pm, int bpp, int xRot, int yRot)
-{
-    int tileX, tileY;
-    int widthTmp;
-    int h, w;
-    int x, y;
-
-    modulus(-yRot, tileHeight, tileY);
-    y = 0;
-    while (height) {
-        h = tileHeight - tileY;
-        if (h > height)
-            h = height;
-        height -= h;
-        widthTmp = width;
-        x = dstX;
-        modulus(dstX - xRot, tileWidth, tileX);
-        while (widthTmp) {
-            w = tileWidth - tileX;
-            if (w > widthTmp)
-                w = widthTmp;
-            widthTmp -= w;
-            fbBlt(tile + tileY * tileStride,
-                  tileStride,
-                  tileX,
-                  dst + y * dstStride,
-                  dstStride, x, w, h, alu, pm, bpp, FALSE, FALSE);
-            x += w;
-            tileX = 0;
-        }
-        y += h;
-        tileY = 0;
-    }
-}
-
-static void
 fbStipple(FbBits * dst, FbStride dstStride,
           int dstX, int dstBpp,
           int width, int height,
diff -r e55ee8a44270 -r 1840e0267a43 external/mit/xorg-server/dist/fb/fbtile.c
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/external/mit/xorg-server/dist/fb/fbtile.c Sun Aug 09 14:55:26 2020 +0000
@@ -0,0 +1,163 @@
+/*
+ * Copyright © 1998 Keith Packard
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of Keith Packard not be used in
+ * advertising or publicity pertaining to distribution of the software without
+ * specific, written prior permission.  Keith Packard makes no
+ * representations about the suitability of this software for any purpose.  It
+ * is provided "as is" without express or implied warranty.
+ *
+ * KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+ * EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
+ * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+ * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+ * PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#ifdef HAVE_DIX_CONFIG_H
+#include <dix-config.h>
+#endif
+
+#include "fb.h"
+
+/*
+ * Accelerated tile fill -- tile width is a power of two not greater
+ * than FB_UNIT
+ */
+
+void
+fbEvenTile(FbBits * dst,
+           FbStride dstStride,
+           int dstX,
+           int width,
+           int height,
+           FbBits * tile,
+           FbStride tileStride,
+           int tileHeight, int alu, FbBits pm, int xRot, int yRot)
+{
+    FbBits *t, *tileEnd, bits;
+    FbBits startmask, endmask;
+    FbBits and, xor;
+    int n, nmiddle;
+    int tileX, tileY;
+    int rot;
+    int startbyte, endbyte;
+
+    dst += dstX >> FB_SHIFT;
+    dstX &= FB_MASK;
+    FbMaskBitsBytes(dstX, width, FbDestInvarientRop(alu, pm),
+                    startmask, startbyte, nmiddle, endmask, endbyte);
+    if (startmask)
+        dstStride--;
+    dstStride -= nmiddle;
+
+    /*
+     * Compute tile start scanline and rotation parameters
+     */
+    tileEnd = tile + tileHeight * tileStride;
+    modulus(-yRot, tileHeight, tileY);
+    t = tile + tileY * tileStride;
+    modulus(-xRot, FB_UNIT, tileX);
+    rot = tileX;
+
+    while (height--) {
+
+        /*
+         * Pick up bits for this scanline
+         */
+        bits = READ(t);
+        t += tileStride;
+        if (t >= tileEnd)
+            t = tile;
+        bits = FbRotLeft(bits, rot);
+        and = fbAnd(alu, bits, pm);
+        xor = fbXor(alu, bits, pm);
+
+        if (startmask) {
+            FbDoLeftMaskByteRRop(dst, startbyte, startmask, and, xor);
+            dst++;
+        }
+        n = nmiddle;
+        if (!and)
+            while (n--)
+                WRITE(dst++, xor);
+        else
+            while (n--) {
+                WRITE(dst, FbDoRRop(READ(dst), and, xor));
+                dst++;
+            }
+        if (endmask)
+            FbDoRightMaskByteRRop(dst, endbyte, endmask, and, xor);
+        dst += dstStride;
+    }
+}
+
+void
+fbOddTile(FbBits * dst,
+          FbStride dstStride,
+          int dstX,
+          int width,
+          int height,
+          FbBits * tile,
+          FbStride tileStride,
+          int tileWidth,
+          int tileHeight, int alu, FbBits pm, int bpp, int xRot, int yRot)
+{
+    int tileX, tileY;
+    int widthTmp;
+    int h, w;
+    int x, y;
+
+    modulus(-yRot, tileHeight, tileY);
+    y = 0;
+    while (height) {
+        h = tileHeight - tileY;
+        if (h > height)
+            h = height;
+        height -= h;
+        widthTmp = width;
+        x = dstX;
+        modulus(dstX - xRot, tileWidth, tileX);
+        while (widthTmp) {
+            w = tileWidth - tileX;
+            if (w > widthTmp)
+                w = widthTmp;
+            widthTmp -= w;
+            fbBlt(tile + tileY * tileStride,
+                  tileStride,
+                  tileX,
+                  dst + y * dstStride,
+                  dstStride, x, w, h, alu, pm, bpp, FALSE, FALSE);
+            x += w;
+            tileX = 0;
+        }
+        y += h;
+        tileY = 0;
+    }
+}
+
+void
+fbTile(FbBits * dst,
+       FbStride dstStride,
+       int dstX,
+       int width,
+       int height,
+       FbBits * tile,
+       FbStride tileStride,
+       int tileWidth,
+       int tileHeight, int alu, FbBits pm, int bpp, int xRot, int yRot)
+{
+    if (FbEvenTile(tileWidth))
+        fbEvenTile(dst, dstStride, dstX, width, height,
+                   tile, tileStride, tileHeight, alu, pm, xRot, yRot);
+    else
+        fbOddTile(dst, dstStride, dstX, width, height,
+                  tile, tileStride, tileWidth, tileHeight,
+                  alu, pm, bpp, xRot, yRot);
+}
diff -r e55ee8a44270 -r 1840e0267a43 external/mit/xorg-server/dist/fb/wfbrename.h
--- a/external/mit/xorg-server/dist/fb/wfbrename.h      Sun Aug 09 11:51:31 2020 +0000
+++ b/external/mit/xorg-server/dist/fb/wfbrename.h      Sun Aug 09 14:55:26 2020 +0000
@@ -43,6 +43,7 @@
 #define fbDots16 wfbDots16
 #define fbDots32 wfbDots32
 #define fbDots8 wfbDots8
+#define fbEvenTile wfbEvenTile
 #define fbExpandDirectColors wfbExpandDirectColors
 #define fbFill wfbFill
 #define fbFillRegionSolid wfbFillRegionSolid
@@ -65,6 +66,7 @@
 #define fbInitVisuals wfbInitVisuals
 #define fbListInstalledColormaps wfbListInstalledColormaps
 #define FbMergeRopBits wFbMergeRopBits
+#define fbOddTile wfbOddTile
 #define fbOver wfbOver
 #define fbOverlayCloseScreen wfbOverlayCloseScreen
 #define fbOverlayCopyWindow wfbOverlayCopyWindow
@@ -116,6 +118,7 @@
 #define _fbSetWindowPixmap _wfbSetWindowPixmap
 #define fbSolid wfbSolid
 #define fbSolidBoxClipped wfbSolidBoxClipped
+#define fbTile wfbTile
 #define fbTrapezoids wfbTrapezoids
 #define fbTriangles wfbTriangles
 #define fbUninstallColormap wfbUninstallColormap



Home | Main Index | Thread Index | Old Index