xserver: Branch 'master' - 5 commits
Søren Sandmann Pedersen
sandmann at kemper.freedesktop.org
Thu Apr 26 05:25:15 EEST 2007
fb/fbpict.c | 215 ++++++++++++++++++++++++++++++++++++++++++++++++++----------
1 files changed, 182 insertions(+), 33 deletions(-)
New commits:
diff-tree 67347739b0571b2978468e8088480b105f505ad2 (from c056ce95d89ef1df57edf47149fc34cd3925496e)
Author: Soren Sandmann Pedersen <ssp at dhcp83-218.boston.redhat.com>
Date: Wed Apr 25 14:19:39 2007 -0400
Don't treat convolution filters as transformations.
Some rearrangement of code to get it closer to pixman.
diff --git a/fb/fbpict.c b/fb/fbpict.c
index f9f5368..4fb949d 100644
--- a/fb/fbpict.c
+++ b/fb/fbpict.c
@@ -1461,9 +1461,9 @@ fbComposite (CARD8 op,
int n;
BoxPtr pbox;
CompositeFunc func = NULL;
- Bool srcRepeat = pSrc->pDrawable && pSrc->repeat;
+ Bool srcRepeat = pSrc->pDrawable && pSrc->repeatType == RepeatNormal;
Bool maskRepeat = FALSE;
- Bool srcTransform = pSrc->pDrawable && pSrc->transform;
+ Bool srcTransform = pSrc->transform != 0;
Bool maskTransform = FALSE;
Bool srcAlphaMap = pSrc->alphaMap != 0;
Bool maskAlphaMap = FALSE;
@@ -1479,9 +1479,6 @@ fbComposite (CARD8 op,
}
#endif
- if (pSrc->filter == PictFilterConvolution)
- srcTransform = TRUE;
-
xDst += pDst->pDrawable->x;
yDst += pDst->pDrawable->y;
if (pSrc->pDrawable) {
@@ -1517,21 +1514,6 @@ fbComposite (CARD8 op,
&& (pSrc->filter != PictFilterConvolution)
&& (!pMask || pMask->filter != PictFilterConvolution))
switch (op) {
- case PictOpSrc:
-#ifdef USE_MMX
- if (!pMask && pSrc->format == pDst->format &&
- pSrc->format != PICT_a8 && pSrc->pDrawable != pDst->pDrawable)
- {
- func = fbCompositeCopyAreammx;
- }
- else
-#endif
- if (pMask == 0)
- {
- if (pSrc->format == pDst->format)
- func = fbCompositeSrcSrc_nxn;
- }
- break;
case PictOpOver:
if (pMask)
{
@@ -1975,6 +1957,21 @@ fbComposite (CARD8 op,
}
}
break;
+ case PictOpSrc:
+#ifdef USE_MMX
+ if (!pMask && pSrc->format == pDst->format &&
+ pSrc->format != PICT_a8 && pSrc->pDrawable != pDst->pDrawable)
+ {
+ func = fbCompositeCopyAreammx;
+ }
+ else
+#endif
+ if (pMask == 0)
+ {
+ if (pSrc->format == pDst->format)
+ func = fbCompositeSrcSrc_nxn;
+ }
+ break;
}
if (!func) {
diff-tree c056ce95d89ef1df57edf47149fc34cd3925496e (from c19ece1d8c32dc81740a4036a642661f54064e75)
Author: Soren Sandmann Pedersen <ssp at dhcp83-218.boston.redhat.com>
Date: Wed Apr 25 13:21:47 2007 -0400
Port MSVC++ CPU detection code from pixman. (Vladimir Vukicevic).
diff --git a/fb/fbpict.c b/fb/fbpict.c
index b4cddd7..f9f5368 100644
--- a/fb/fbpict.c
+++ b/fb/fbpict.c
@@ -1509,7 +1509,6 @@ fbComposite (CARD8 op,
pMask->pDrawable->width == 1 &&
pMask->pDrawable->height == 1)
maskTransform = FALSE;
-
}
if (pSrc->pDrawable && (!pMask || pMask->pDrawable)
@@ -2116,7 +2115,7 @@ enum CPUFeatures {
static unsigned int detectCPUFeatures(void) {
unsigned int features = 0;
- unsigned int result;
+ unsigned int result = 0;
#ifdef HAVE_GETISAX
if (getisax(&result, 1)) {
@@ -2133,8 +2132,13 @@ static unsigned int detectCPUFeatures(vo
}
#else
char vendor[13];
+#ifdef _MSC_VER
+ int vendor0 = 0, vendor1, vendor2;
+#endif
vendor[0] = 0;
vendor[12] = 0;
+
+#ifdef __GNUC__
/* see p. 118 of amd64 instruction set manual Vol3 */
/* We need to be careful about the handling of %ebx and
* %esp here. We can't declare either one as clobbered
@@ -2153,7 +2157,7 @@ static unsigned int detectCPUFeatures(vo
"pop %%eax\n"
"mov $0x0, %%edx\n"
"xor %%ecx, %%eax\n"
- "jz 1\n"
+ "jz 1f\n"
"mov $0x00000000, %%eax\n"
"push %%ebx\n"
@@ -2177,6 +2181,45 @@ static unsigned int detectCPUFeatures(vo
: "%eax", "%ecx", "%edx"
);
+#elif defined (_MSC_VER)
+
+ _asm {
+ pushfd
+ pop eax
+ mov ecx, eax
+ xor eax, 00200000h
+ push eax
+ popfd
+ pushfd
+ pop eax
+ mov edx, 0
+ xor eax, ecx
+ jz nocpuid
+
+ mov eax, 0
+ push ebx
+ cpuid
+ mov eax, ebx
+ pop ebx
+ mov vendor0, eax
+ mov vendor1, edx
+ mov vendor2, ecx
+ mov eax, 1
+ push ebx
+ cpuid
+ pop ebx
+ nocpuid:
+ mov result, edx
+ }
+ memmove (vendor+0, &vendor0, 4);
+ memmove (vendor+4, &vendor1, 4);
+ memmove (vendor+8, &vendor2, 4);
+
+#else
+# error unsupported compiler
+#endif
+
+ features = 0;
if (result) {
/* result now contains the standard feature bits */
if (result & (1 << 15))
@@ -2191,14 +2234,13 @@ static unsigned int detectCPUFeatures(vo
(strcmp(vendor, "AuthenticAMD") == 0 ||
strcmp(vendor, "Geode by NSC") == 0)) {
/* check for AMD MMX extensions */
-
- unsigned int result;
+#ifdef __GNUC__
__asm__("push %%ebx\n"
"mov $0x80000000, %%eax\n"
"cpuid\n"
"xor %%edx, %%edx\n"
"cmp $0x1, %%eax\n"
- "jge 2\n"
+ "jge 2f\n"
"mov $0x80000001, %%eax\n"
"cpuid\n"
"2:\n"
@@ -2208,11 +2250,27 @@ static unsigned int detectCPUFeatures(vo
:
: "%eax", "%ecx", "%edx"
);
+#elif defined _MSC_VER
+ _asm {
+ push ebx
+ mov eax, 80000000h
+ cpuid
+ xor edx, edx
+ cmp eax, 1
+ jge notamd
+ mov eax, 80000001h
+ cpuid
+ notamd:
+ pop ebx
+ mov result, edx
+ }
+#endif
if (result & (1<<22))
features |= MMX_Extensions;
}
}
#endif /* HAVE_GETISAX */
+
return features;
}
diff-tree c19ece1d8c32dc81740a4036a642661f54064e75 (from 48c73dfc369fdf8f6023436ebe82bb604f76bb80)
Author: Soren Sandmann Pedersen <ssp at dhcp83-218.boston.redhat.com>
Date: Wed Apr 25 12:34:19 2007 -0400
Integrate optimization from xserver from David Reveman where repeats
get handled by fbFetchTransformed() rather than in the region walking
code.
diff --git a/fb/fbpict.c b/fb/fbpict.c
index b9c463a..b4cddd7 100644
--- a/fb/fbpict.c
+++ b/fb/fbpict.c
@@ -1463,6 +1463,8 @@ fbComposite (CARD8 op,
CompositeFunc func = NULL;
Bool srcRepeat = pSrc->pDrawable && pSrc->repeat;
Bool maskRepeat = FALSE;
+ Bool srcTransform = pSrc->pDrawable && pSrc->transform;
+ Bool maskTransform = FALSE;
Bool srcAlphaMap = pSrc->alphaMap != 0;
Bool maskAlphaMap = FALSE;
Bool dstAlphaMap = pDst->alphaMap != 0;
@@ -1476,23 +1478,42 @@ fbComposite (CARD8 op,
mmx_setup = TRUE;
}
#endif
-
+
+ if (pSrc->filter == PictFilterConvolution)
+ srcTransform = TRUE;
+
xDst += pDst->pDrawable->x;
yDst += pDst->pDrawable->y;
if (pSrc->pDrawable) {
xSrc += pSrc->pDrawable->x;
ySrc += pSrc->pDrawable->y;
}
+
+ if (srcRepeat && srcTransform &&
+ pSrc->pDrawable->width == 1 &&
+ pSrc->pDrawable->height == 1)
+ srcTransform = FALSE;
+
if (pMask && pMask->pDrawable)
{
xMask += pMask->pDrawable->x;
yMask += pMask->pDrawable->y;
maskRepeat = pMask->repeat == RepeatNormal;
+
+ if (pMask->filter == PictFilterConvolution)
+ maskTransform = TRUE;
+
maskAlphaMap = pMask->alphaMap != 0;
+
+ if (maskRepeat && maskTransform &&
+ pMask->pDrawable->width == 1 &&
+ pMask->pDrawable->height == 1)
+ maskTransform = FALSE;
+
}
if (pSrc->pDrawable && (!pMask || pMask->pDrawable)
- && !pSrc->transform && !(pMask && pMask->transform)
+ && !srcTransform && !maskTransform
&& !maskAlphaMap && !srcAlphaMap && !dstAlphaMap
&& (pSrc->filter != PictFilterConvolution)
&& (!pMask || pMask->filter != PictFilterConvolution))
@@ -1977,6 +1998,12 @@ fbComposite (CARD8 op,
height))
return;
+ /* if we are transforming, we handle repeats in fbFetchTransformed */
+ if (srcTransform)
+ srcRepeat = FALSE;
+ if (maskTransform)
+ maskRepeat = FALSE;
+
n = REGION_NUM_RECTS (®ion);
pbox = REGION_RECTS (®ion);
while (n--)
diff-tree 48c73dfc369fdf8f6023436ebe82bb604f76bb80 (from 66ba3d758a368bf83d75bab8b08bdb6b34925e40)
Author: Soren Sandmann Pedersen <ssp at dhcp83-218.boston.redhat.com>
Date: Wed Apr 25 12:09:22 2007 -0400
Add function fbCompositeSrcAdd_8888x8x8(), and fix a bug where
srcRepeat = FALSE would be set in the wrong place.
diff --git a/fb/fbpict.c b/fb/fbpict.c
index db70872..b9c463a 100644
--- a/fb/fbpict.c
+++ b/fb/fbpict.c
@@ -894,6 +894,61 @@ fbCompositeSrcAdd_8888x8888 (CARD8 op,
fbFinishAccess (pSrc->pDrawable);
}
+static void
+fbCompositeSrcAdd_8888x8x8 (CARD8 op,
+ PicturePtr pSrc,
+ PicturePtr pMask,
+ PicturePtr pDst,
+ INT16 xSrc,
+ INT16 ySrc,
+ INT16 xMask,
+ INT16 yMask,
+ INT16 xDst,
+ INT16 yDst,
+ CARD16 width,
+ CARD16 height)
+{
+ CARD8 *dstLine, *dst;
+ CARD8 *maskLine, *mask;
+ FbStride dstStride, maskStride;
+ CARD16 w;
+ CARD32 src;
+ CARD8 sa;
+
+ fbComposeGetStart (pDst, xDst, yDst, CARD8, dstStride, dstLine, 1);
+ fbComposeGetStart (pMask, xMask, yMask, CARD8, maskStride, maskLine, 1);
+ fbComposeGetSolid (pSrc, src, pDst->format);
+ sa = (src >> 24);
+
+ while (height--)
+ {
+ dst = dstLine;
+ dstLine += dstStride;
+ mask = maskLine;
+ maskLine += maskStride;
+ w = width;
+
+ while (w--)
+ {
+ CARD16 tmp;
+ CARD16 a;
+ CARD32 m, d;
+ CARD32 r;
+
+ a = READ(mask++);
+ d = READ(dst);
+
+ m = FbInU (sa, 0, a, tmp);
+ r = FbAdd (m, d, 0, tmp);
+
+ WRITE(dst++, r);
+ }
+ }
+
+ fbFinishAccess(pDst->pDrawable);
+ fbFinishAccess(pMask->pDrawable);
+}
+
void
fbCompositeSrcAdd_1000x1000 (CARD8 op,
PicturePtr pSrc,
@@ -1587,6 +1642,8 @@ fbComposite (CARD8 op,
default:
break;
}
+ if (func != fbCompositeGeneral)
+ srcRepeat = FALSE;
}
else if (! srcRepeat) /* has mask and non-repeating source */
{
@@ -1669,8 +1726,6 @@ fbComposite (CARD8 op,
}
}
}
- if (func != fbCompositeGeneral)
- srcRepeat = FALSE;
}
else if (maskRepeat &&
pMask->pDrawable->width == 1 &&
@@ -1887,6 +1942,18 @@ fbComposite (CARD8 op,
break;
}
}
+ else
+ {
+ if ((pSrc->format == PICT_a8r8g8b8 ||
+ pSrc->format == PICT_a8b8g8r8) &&
+ fbCanGetSolid (pSrc) &&
+ pMask->format == PICT_a8 &&
+ pDst->format == PICT_a8)
+ {
+ srcRepeat = FALSE;
+ func = fbCompositeSrcAdd_8888x8x8;
+ }
+ }
break;
}
diff-tree 66ba3d758a368bf83d75bab8b08bdb6b34925e40 (from c09e68ce30dabd6b7068b163b9d2382d85d0d0bc)
Author: Soren Sandmann Pedersen <ssp at dhcp83-218.boston.redhat.com>
Date: Wed Apr 25 10:31:38 2007 -0400
Various fixes from xserver via pixman (Billy Biggs)
diff --git a/fb/fbpict.c b/fb/fbpict.c
index 44bee1b..db70872 100644
--- a/fb/fbpict.c
+++ b/fb/fbpict.c
@@ -123,7 +123,7 @@ fbIn (CARD32 x, CARD8 y)
#if IMAGE_BYTE_ORDER == LSBFirst
-#define setupPackedReader(count,temp,where,workingWhere,workingVal) count=(int)where; \
+#define setupPackedReader(count,temp,where,workingWhere,workingVal) count=(long)where; \
temp=count&3; \
where-=temp; \
workingWhere=(CARD32 *)where; \
@@ -136,7 +136,7 @@ fbIn (CARD32 x, CARD8 y)
#define writePacked(what) workingoDest>>=8; workingoDest|=(what<<24); ww--; if(!ww) { ww=4; WRITE (wodst++, workingoDest); }
#else
#warning "I havn't tested fbCompositeTrans_0888xnx0888() on big endian yet!"
- #define setupPackedReader(count,temp,where,workingWhere,workingVal) count=(int)where; \
+ #define setupPackedReader(count,temp,where,workingWhere,workingVal) count=(long)where; \
temp=count&3; \
where-=temp; \
workingWhere=(CARD32 *)where; \
@@ -331,7 +331,7 @@ fbCompositeSolidMask_nx8x0888 (CARD8
while (height--)
{
/* fixme: cleanup unused */
- unsigned int wt, wd;
+ unsigned long wt, wd;
CARD32 workingiDest;
CARD32 *widst;
@@ -1074,7 +1074,7 @@ fbCompositeTrans_0565xnx0565(CARD8
srcLine += srcStride;
w = width;
- if(((int)src&1)==1)
+ if(((long)src&1)==1)
{
s_16 = READ(src++);
d_16 = READ(dst);
@@ -1082,7 +1082,7 @@ fbCompositeTrans_0565xnx0565(CARD8
w--;
}
isrc=(CARD32 *)src;
- if(((int)dst&1)==0)
+ if(((long)dst&1)==0)
{
idst=(CARD32 *)dst;
while (w>1)
@@ -1173,7 +1173,7 @@ fbCompositeTrans_0888xnx0888(CARD8
fbComposeGetStart (pDst, xDst, yDst, CARD8, dstStride, dstLine, 3);
{
- unsigned int ws,wt;
+ unsigned long ws,wt;
CARD32 workingSource;
CARD32 *wsrc, *wdst, *widst;
CARD32 rs, rd, nd;
@@ -1196,7 +1196,7 @@ fbCompositeTrans_0888xnx0888(CARD8
setupPackedReader(ws,wt,isrc,wsrc,workingSource);
/* get to word aligned */
- switch(!(int)src&3)
+ switch(~(long)dst&3)
{
case 1:
readPackedSource(rs);
@@ -1272,7 +1272,7 @@ fbCompositeTrans_0888xnx0888(CARD8
srcLine += srcStride;
w = width*3;
/* get to word aligned */
- switch(!(int)src&3)
+ switch(~(long)src&3)
{
case 1:
rd=alphamaskCombine24(READ(src++), READ(dst))>>8;
More information about the xorg-commit
mailing list