]> code.ossystems Code Review - openembedded-core.git/commitdiff
Add https://bugs.freedesktop.org/show_bug.cgi?id=4537 faster rotated blits patch
authorMatthew Allum <mallum@openedhand.com>
Thu, 27 Oct 2005 15:13:29 +0000 (15:13 +0000)
committerMatthew Allum <mallum@openedhand.com>
Thu, 27 Oct 2005 15:13:29 +0000 (15:13 +0000)
git-svn-id: https://svn.o-hand.com/repos/poky@145 311d38ba-8fff-0310-9ca6-ca027cbcb966

openembedded/packages/xserver/xserver-kdrive/faster-rotated.patch [new file with mode: 0644]
openembedded/packages/xserver/xserver-kdrive_20050207.bb

diff --git a/openembedded/packages/xserver/xserver-kdrive/faster-rotated.patch b/openembedded/packages/xserver/xserver-kdrive/faster-rotated.patch
new file mode 100644 (file)
index 0000000..eaf7dde
--- /dev/null
@@ -0,0 +1,241 @@
+Index: xserver/miext/shadow/shrotate.c
+===================================================================
+RCS file: /scratch/openbsd/cvs/XF4/xc/programs/Xserver/miext/shadow/shrotate.c,v
+retrieving revision 1.2
+diff -u -r1.2 shrotate.c
+--- xserver/miext/shadow/shrotate.c    3 Nov 2004 00:09:54 -0000       1.2
++++ xserver/miext/shadow/shrotate.c    20 Sep 2005 23:07:58 -0000
+@@ -45,6 +45,106 @@
+ #define TOP_TO_BOTTOM 2
+ #define BOTTOM_TO_TOP -2
++
++static void 
++shadowUpdateRotatePackedSubRectangle(shadowBufPtr pBuf,
++                                   FbBits *shaLine, int shaFirstShift, 
++                                   int shaStepOverX, int shaStepOverY,
++                                   int shaStepDownX, int shaStepDownY,
++                                   int shaBpp, FbBits shaMask,
++                                   ScreenPtr pScreen,
++                                   int scr_x1, int scr_y, 
++                                   int scr_h, int scr_w,
++                                   int pixelsPerBits)
++{
++    FbBits *sha;
++    int shaShift;
++    int scr_x;
++    int w;
++
++    /*
++     * Copy the bits, always write across the physical frame buffer
++     * to take advantage of write combining.
++     */
++    while (scr_h--)
++    {
++      int         p;
++      FbBits  bits;
++      FbBits  *win;
++      int         i;
++      CARD32  winSize;
++      
++      sha = shaLine;
++      shaShift = shaFirstShift;
++      w = scr_w;
++      scr_x = scr_x1 * shaBpp >> FB_SHIFT;
++      
++      while (w)
++      {
++        /*
++         * Map some of this line
++         */
++        win = (FbBits *) (*pBuf->window) (pScreen,
++                                          scr_y,
++                                          scr_x << 2,
++                                          SHADOW_WINDOW_WRITE,
++                                          &winSize,
++                                          pBuf->closure);
++          i = (winSize >> 2);
++          if (i > w)
++              i = w;
++          w -= i;
++          scr_x += i;
++          /*
++           * Copy the portion of the line mapped
++           */
++          while (i--)
++          {
++              bits = 0;
++              p = pixelsPerBits;
++              /*
++               * Build one word of output from multiple inputs
++               */
++              while (p--)
++              {
++                  bits = FbScrLeft(bits, shaBpp);
++                  bits |= FbScrRight (*sha, shaShift) & shaMask;
++                  
++                  shaShift -= shaStepOverX;
++                  if (shaShift >= FB_UNIT)
++                  {
++                      shaShift -= FB_UNIT;
++                          sha--;
++                  }
++                  else if (shaShift < 0)
++                  {
++                      shaShift += FB_UNIT;
++                      sha++;
++                  }
++                  sha += shaStepOverY;
++              }
++              *win++ = bits;
++          }
++      }
++      scr_y++;
++      shaFirstShift -= shaStepDownX;
++      if (shaFirstShift >= FB_UNIT)
++      {
++          shaFirstShift -= FB_UNIT;
++          shaLine--;
++      }
++      else if (shaFirstShift < 0)
++      {
++          shaFirstShift += FB_UNIT;
++          shaLine++;
++      }
++      shaLine += shaStepDownY;
++    }
++}
++
++#define BLOCKSIZE_HEIGHT 32
++#define BLOCKSIZE_WIDTH 32
++
+ void
+ shadowUpdateRotatePacked (ScreenPtr   pScreen,
+                         shadowBufPtr  pBuf)
+@@ -61,7 +161,6 @@
+     int               sha_x1 = 0, sha_y1 = 0;
+     int               scr_x1 = 0, scr_x2 = 0, scr_y1 = 0, scr_y2 = 0, scr_w, scr_h;
+     int               scr_x, scr_y;
+-    int               w;
+     int               pixelsPerBits;
+     int               pixelsMask;
+     FbStride  shaStepOverY = 0, shaStepDownY = 0;
+@@ -221,86 +320,46 @@
+                  ((sha_x1 * shaBpp) >> FB_SHIFT));
+       /*
+-       * Copy the bits, always write across the physical frame buffer
+-       * to take advantage of write combining.
++       * Copy in blocks of size BLOCKSIZE_WIDTH x BLOCKSIZE_HEIGHT
++       * to reduce the number of cache misses when rotating 90 or
++       * 270 degrees.
+        */
+-      while (scr_h--)
++      for (scr_y = scr_y1; scr_y < scr_y2; scr_y += BLOCKSIZE_HEIGHT)
+       {
+-          int     p;
+-          FbBits  bits;
+-          FbBits  *win;
+-          int     i;
+-          CARD32  winSize;
+-          
+           sha = shaLine;
+           shaShift = shaFirstShift;
+-          w = scr_w;
+-          scr_x = scr_x1 * shaBpp >> FB_SHIFT;
+-          while (w)
++          for (scr_x = scr_x1; scr_x < scr_x2; scr_x += BLOCKSIZE_WIDTH)
+           {
+-              /*
+-               * Map some of this line
+-               */
+-              win = (FbBits *) (*pBuf->window) (pScreen,
+-                                                scr_y,
+-                                                scr_x << 2,
+-                                                SHADOW_WINDOW_WRITE,
+-                                                &winSize,
+-                                                pBuf->closure);
+-              i = (winSize >> 2);
+-              if (i > w)
+-                  i = w;
+-              w -= i;
+-              scr_x += i;
+-              /*
+-               * Copy the portion of the line mapped
+-               */
+-              while (i--)
+-              {
+-                  bits = 0;
+-                  p = pixelsPerBits;
+-                  /*
+-                   * Build one word of output from multiple inputs
+-                   * 
+-                   * Note that for 90/270 rotations, this will walk
+-                   * down the shadow hitting each scanline once.
+-                   * This is probably not very efficient.
+-                   */
+-                  while (p--)
+-                  {
+-                      bits = FbScrLeft(bits, shaBpp);
+-                      bits |= FbScrRight (*sha, shaShift) & shaMask;
++              int h = BLOCKSIZE_HEIGHT;
++              int w = BLOCKSIZE_WIDTH;
+-                      shaShift -= shaStepOverX;
+-                      if (shaShift >= FB_UNIT)
+-                      {
+-                          shaShift -= FB_UNIT;
+-                          sha--;
+-                      }
+-                      else if (shaShift < 0)
+-                      {
+-                          shaShift += FB_UNIT;
+-                          sha++;
+-                      }
+-                      sha += shaStepOverY;
+-                  }
+-                  *win++ = bits;
+-              }
+-          }
+-          scr_y++;
+-          shaFirstShift -= shaStepDownX;
+-          if (shaFirstShift >= FB_UNIT)
+-          {
+-              shaFirstShift -= FB_UNIT;
+-              shaLine--;
+-          }
+-          else if (shaFirstShift < 0)
+-          {
+-              shaFirstShift += FB_UNIT;
+-              shaLine++;
++              if (scr_y + h > scr_y2)
++                  h = scr_y2 - scr_y;
++              if (scr_x + w > scr_x2)
++                  w = scr_x2 - scr_x;
++              w = (w * shaBpp) >> FB_SHIFT;
++
++              shadowUpdateRotatePackedSubRectangle
++                (pBuf,
++                 sha, shaShift,
++                 shaStepOverX, shaStepOverY,
++                 shaStepDownX, shaStepDownY,
++                 shaBpp, shaMask,
++                 pScreen,
++                 scr_x, scr_y,
++                 h, w,
++                 pixelsPerBits);
++              
++              shaShift -= BLOCKSIZE_WIDTH * shaStepOverX;
++              sha += BLOCKSIZE_WIDTH * shaStepOverY;
++              sha -= (shaShift >> FB_SHIFT); 
++              shaShift &= FB_MASK; 
+           }
+-          shaLine += shaStepDownY;
++          shaFirstShift -= BLOCKSIZE_HEIGHT * shaStepDownX;
++          shaLine += BLOCKSIZE_HEIGHT * shaStepDownY;
++          shaLine -= (shaFirstShift >> FB_SHIFT); 
++          shaFirstShift &= FB_MASK; 
+       }
+     }
+ }
index 65f14200964cf6784330e917fb1a996d649a945e..48ae523c77b7c6605677e3528c648ea312bba04f 100644 (file)
@@ -20,7 +20,7 @@ DESCRIPTION_xserver-kdrive-epson = "X server from freedesktop.org, supporting Ep
 DESCRIPTION_xserver-kdrive-fake = "Fake X server"
 DESCRIPTION_xserver-kdrive-xephyr = "X server in an X window"
 
-PR = "r4"
+PR = "r5"
 
 FILES_xserver-kdrive-fbdev = "${bindir}/Xfbdev"
 FILES_xserver-kdrive-ati = "${bindir}/Xati"
@@ -35,6 +35,7 @@ FILES_xserver-kdrive-xephyr = "${bindir}/Xephyr"
 
 SRC_URI = "cvs://anoncvs:anoncvs@pdx.freedesktop.org/cvs/xserver;module=xserver;date=${FIXEDCVSDATE} \
        file://kmode.patch;patch=1 \
+       file://faster-rotated.patch;patch=1 \
        file://fbdev-not-fix.patch;patch=1 "
 
 SRC_URI_append_mnci   =        " file://onlyfb.patch;patch=1 \