diff options
author | Izumi Tsutsui <tsutsui@ceres.dti.ne.jp> | 2023-03-18 07:24:31 +0900 |
---|---|---|
committer | Adam Jackson <ajax@nwnk.net> | 2023-04-19 15:33:59 +0000 |
commit | 7b1758936bd644020a560f2739ad7a50fbb87b17 (patch) | |
tree | 826ef12799379b1c15a72bb067444fc277155864 | |
parent | 34a430a16ec2cb9851b1f2bc7fc2117e19b9fcc7 (diff) | |
download | xserver-7b1758936bd644020a560f2739ad7a50fbb87b17.tar.gz |
Revert "fb: Remove even/odd tile slow-pathing"
This reverts commit e572bcc7f4236b7e0f23ab762f225b3bce37db59.
Closes: #1056
-rw-r--r-- | fb/fb.h | 39 | ||||
-rw-r--r-- | fb/fbfill.c | 38 | ||||
-rw-r--r-- | fb/fbtile.c | 163 | ||||
-rw-r--r-- | fb/meson.build | 1 | ||||
-rw-r--r-- | fb/wfbrename.h | 3 |
5 files changed, 206 insertions, 38 deletions
@@ -1096,6 +1096,45 @@ fbSolid(FbBits * dst, int dstX, int bpp, int width, int height, FbBits and, FbBits xor); /* + * 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); + +/* * fbutil.c */ extern _X_EXPORT FbBits fbReplicatePixel(Pixel p, int bpp); diff --git a/fb/fbfill.c b/fb/fbfill.c index 05d81ab77..ad09671fa 100644 --- a/fb/fbfill.c +++ b/fb/fbfill.c @@ -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 --git a/fb/fbtile.c b/fb/fbtile.c new file mode 100644 index 000000000..785c5f0e4 --- /dev/null +++ b/fb/fbtile.c @@ -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 --git a/fb/meson.build b/fb/meson.build index 1d8d259a1..e4e311ff4 100644 --- a/fb/meson.build +++ b/fb/meson.build @@ -23,6 +23,7 @@ srcs_fb = [ 'fbseg.c', 'fbsetsp.c', 'fbsolid.c', + 'fbtile.c', 'fbtrap.c', 'fbutil.c', 'fbwindow.c', diff --git a/fb/wfbrename.h b/fb/wfbrename.h index ffdcbed96..4977f2067 100644 --- a/fb/wfbrename.h +++ b/fb/wfbrename.h @@ -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 |