1 Index: xserver/miext/shadow/shrotate.c
2 ===================================================================
3 RCS file: /scratch/openbsd/cvs/XF4/xc/programs/Xserver/miext/shadow/shrotate.c,v
4 retrieving revision 1.2
5 diff -u -r1.2 shrotate.c
6 --- xserver/miext/shadow/shrotate.c 3 Nov 2004 00:09:54 -0000 1.2
7 +++ xserver/miext/shadow/shrotate.c 20 Sep 2005 23:07:58 -0000
9 #define TOP_TO_BOTTOM 2
10 #define BOTTOM_TO_TOP -2
14 +shadowUpdateRotatePackedSubRectangle(shadowBufPtr pBuf,
15 + FbBits *shaLine, int shaFirstShift,
16 + int shaStepOverX, int shaStepOverY,
17 + int shaStepDownX, int shaStepDownY,
18 + int shaBpp, FbBits shaMask,
20 + int scr_x1, int scr_y,
21 + int scr_h, int scr_w,
30 + * Copy the bits, always write across the physical frame buffer
31 + * to take advantage of write combining.
42 + shaShift = shaFirstShift;
44 + scr_x = scr_x1 * shaBpp >> FB_SHIFT;
49 + * Map some of this line
51 + win = (FbBits *) (*pBuf->window) (pScreen,
54 + SHADOW_WINDOW_WRITE,
63 + * Copy the portion of the line mapped
70 + * Build one word of output from multiple inputs
74 + bits = FbScrLeft(bits, shaBpp);
75 + bits |= FbScrRight (*sha, shaShift) & shaMask;
77 + shaShift -= shaStepOverX;
78 + if (shaShift >= FB_UNIT)
80 + shaShift -= FB_UNIT;
83 + else if (shaShift < 0)
85 + shaShift += FB_UNIT;
88 + sha += shaStepOverY;
94 + shaFirstShift -= shaStepDownX;
95 + if (shaFirstShift >= FB_UNIT)
97 + shaFirstShift -= FB_UNIT;
100 + else if (shaFirstShift < 0)
102 + shaFirstShift += FB_UNIT;
105 + shaLine += shaStepDownY;
109 +#define BLOCKSIZE_HEIGHT 32
110 +#define BLOCKSIZE_WIDTH 32
113 shadowUpdateRotatePacked (ScreenPtr pScreen,
116 int sha_x1 = 0, sha_y1 = 0;
117 int scr_x1 = 0, scr_x2 = 0, scr_y1 = 0, scr_y2 = 0, scr_w, scr_h;
122 FbStride shaStepOverY = 0, shaStepDownY = 0;
123 @@ -221,86 +320,46 @@
124 ((sha_x1 * shaBpp) >> FB_SHIFT));
127 - * Copy the bits, always write across the physical frame buffer
128 - * to take advantage of write combining.
129 + * Copy in blocks of size BLOCKSIZE_WIDTH x BLOCKSIZE_HEIGHT
130 + * to reduce the number of cache misses when rotating 90 or
134 + for (scr_y = scr_y1; scr_y < scr_y2; scr_y += BLOCKSIZE_HEIGHT)
143 shaShift = shaFirstShift;
145 - scr_x = scr_x1 * shaBpp >> FB_SHIFT;
148 + for (scr_x = scr_x1; scr_x < scr_x2; scr_x += BLOCKSIZE_WIDTH)
151 - * Map some of this line
153 - win = (FbBits *) (*pBuf->window) (pScreen,
156 - SHADOW_WINDOW_WRITE,
159 - i = (winSize >> 2);
165 - * Copy the portion of the line mapped
172 - * Build one word of output from multiple inputs
174 - * Note that for 90/270 rotations, this will walk
175 - * down the shadow hitting each scanline once.
176 - * This is probably not very efficient.
180 - bits = FbScrLeft(bits, shaBpp);
181 - bits |= FbScrRight (*sha, shaShift) & shaMask;
182 + int h = BLOCKSIZE_HEIGHT;
183 + int w = BLOCKSIZE_WIDTH;
185 - shaShift -= shaStepOverX;
186 - if (shaShift >= FB_UNIT)
188 - shaShift -= FB_UNIT;
191 - else if (shaShift < 0)
193 - shaShift += FB_UNIT;
196 - sha += shaStepOverY;
202 - shaFirstShift -= shaStepDownX;
203 - if (shaFirstShift >= FB_UNIT)
205 - shaFirstShift -= FB_UNIT;
208 - else if (shaFirstShift < 0)
210 - shaFirstShift += FB_UNIT;
212 + if (scr_y + h > scr_y2)
213 + h = scr_y2 - scr_y;
214 + if (scr_x + w > scr_x2)
215 + w = scr_x2 - scr_x;
216 + w = (w * shaBpp) >> FB_SHIFT;
218 + shadowUpdateRotatePackedSubRectangle
221 + shaStepOverX, shaStepOverY,
222 + shaStepDownX, shaStepDownY,
229 + shaShift -= BLOCKSIZE_WIDTH * shaStepOverX;
230 + sha += BLOCKSIZE_WIDTH * shaStepOverY;
231 + sha -= (shaShift >> FB_SHIFT);
232 + shaShift &= FB_MASK;
234 - shaLine += shaStepDownY;
235 + shaFirstShift -= BLOCKSIZE_HEIGHT * shaStepDownX;
236 + shaLine += BLOCKSIZE_HEIGHT * shaStepDownY;
237 + shaLine -= (shaFirstShift >> FB_SHIFT);
238 + shaFirstShift &= FB_MASK;