summaryrefslogtreecommitdiff
path: root/fb/fbpict.c
diff options
context:
space:
mode:
authorAdam Jackson <ajax@nwnk.net>2005-05-08 23:34:15 +0000
committerAdam Jackson <ajax@nwnk.net>2005-05-08 23:34:15 +0000
commit2de24db63eb65974ac547facf2a99aa4709d54b3 (patch)
tree9e1c2d5ea337b9c7fa01a8cd3cfc8a3dcc233205 /fb/fbpict.c
parent2c9b1e337b2e82e10909f62e8cd8c2c7a402fdd8 (diff)
downloadxserver-2de24db63eb65974ac547facf2a99aa4709d54b3.tar.gz
Render performance improvements. (Lars Knoll, Zack Rusin)
Diffstat (limited to 'fb/fbpict.c')
-rw-r--r--fb/fbpict.c51
1 files changed, 35 insertions, 16 deletions
diff --git a/fb/fbpict.c b/fb/fbpict.c
index 67db2e1c1..f2b4fe821 100644
--- a/fb/fbpict.c
+++ b/fb/fbpict.c
@@ -32,6 +32,19 @@
#include "fbpict.h"
#include "fbmmx.h"
+typedef void (*CompositeFunc) (CARD8 op,
+ PicturePtr pSrc,
+ PicturePtr pMask,
+ PicturePtr pDst,
+ INT16 xSrc,
+ INT16 ySrc,
+ INT16 xMask,
+ INT16 yMask,
+ INT16 xDst,
+ INT16 yDst,
+ CARD16 width,
+ CARD16 height);
+
CARD32
fbOver (CARD32 x, CARD32 y)
{
@@ -824,7 +837,7 @@ fbComposite (CARD8 op,
RegionRec region;
int n;
BoxPtr pbox;
- CompositeFunc func;
+ CompositeFunc func = 0;
Bool srcRepeat = pSrc->repeat;
Bool maskRepeat = FALSE;
Bool srcAlphaMap = pSrc->alphaMap != 0;
@@ -845,21 +858,6 @@ fbComposite (CARD8 op,
maskAlphaMap = pMask->alphaMap != 0;
}
- if (!miComputeCompositeRegion (&region,
- pSrc,
- pMask,
- pDst,
- xSrc,
- ySrc,
- xMask,
- yMask,
- xDst,
- yDst,
- width,
- height))
- return;
-
- func = fbCompositeGeneral;
if (!pSrc->transform && !(pMask && pMask->transform))
if (!maskAlphaMap && !srcAlphaMap && !dstAlphaMap)
switch (op) {
@@ -1212,6 +1210,27 @@ fbComposite (CARD8 op,
}
break;
}
+
+ if (!func) {
+ /* no fast path, use the general code */
+ fbCompositeGeneral(op, pSrc, pMask, pDst, xSrc, ySrc, xMask, yMask, xDst, yDst, width, height);
+ return;
+ }
+
+ if (!miComputeCompositeRegion (&region,
+ pSrc,
+ pMask,
+ pDst,
+ xSrc,
+ ySrc,
+ xMask,
+ yMask,
+ xDst,
+ yDst,
+ width,
+ height))
+ return;
+
n = REGION_NUM_RECTS (&region);
pbox = REGION_RECTS (&region);
while (n--)