fb composite fixes

Eric Anholt anholt3@yahoo.com
Mon, 23 Feb 2004 06:36:11 -0800 (PST)


--0-14632160-1077546971=:46914
Content-Type: text/plain; charset=us-ascii
Content-Id: 
Content-Disposition: inline

Well, it turns out I wasn't actually testing component
alpha, and there are plenty of problems.  Attached is
the current patch to fb that I have. 

- Saturate was mapped to DisjointOver instead of
DisjointOverReverse
- fbCombineAlphaMask was multiplying each source
channel by each mask channel, instead of the source
alpha by each mask channel.
- fbCombineAtopC wasn't inverting the source alpha
value like it should.
- using the fetcha function appears to reduce
correctness.  It looks like with fetcha, alpha is
replicated into other channels when r,g,b are not
present, which is not intended according to the spec
as far as I can tell.  At least one of the fetcha uses
would have no effect except running slower, as far as
I could tell.
- fbCombineXorC was using the blue source alpha
channel for the operation for all channels.

Disjoint and Conjoint each had the following problems
with component alpha:
- the CombineAIn case was using Out instead of In
- The blue source alpha channel was used for all
ConbineB operations, instead of calculating using each
source alpha chanel.

The source coords test appears to be working, too. 
Need to sabotage the r128 code to see if I'm hitting
any HW accel still.



__________________________________
Do you Yahoo!?
Yahoo! Mail SpamGuard - Read only the mail you want.
http://antispam.yahoo.com/tools
--0-14632160-1077546971=:46914
Content-Type: text/plain; name="xserver-fb-compositefix.diff"
Content-Description: xserver-fb-compositefix.diff
Content-Disposition: inline; filename="xserver-fb-compositefix.diff"

Index: fbcompose.c
===================================================================
RCS file: /cvs/xserver/xserver/fb/fbcompose.c,v
retrieving revision 1.19
diff -u -r1.19 fbcompose.c
--- fbcompose.c	28 Dec 2003 12:58:00 -0000	1.19
+++ fbcompose.c	23 Feb 2004 07:59:36 -0000
@@ -91,7 +91,7 @@
 	return s;
     }
     
-    a = (*msk->fetcha) (msk);
+    a = (*msk->fetch) (msk);
     if (!a)
     {
 	s.value = 0;
@@ -138,7 +138,7 @@
 	return (*src->fetch) (src);
     }
     
-    a = (*msk->fetcha) (msk);
+    a = (*msk->fetch) (msk);
     if (!a)
 	return a;
     
@@ -190,18 +190,18 @@
     if (!msk)
 	return (*src->fetch) (src);
     
-    a = (*msk->fetcha) (msk);
+    a = (*msk->fetch) (msk);
     if (!a)
 	return 0;
     
-    x = (*src->fetcha) (src);
-    if (a == 0xffffffff)
-	return x;
+    x = (*src->fetch) (src) >> 24;
+    if (x == 0xff)
+	return a;
     
-    m = FbInC(x,0,a,t);
-    n = FbInC(x,8,a,t);
-    o = FbInC(x,16,a,t);
-    p = FbInC(x,24,a,t);
+    m = FbInU(a,0,x,t);
+    n = FbInU(a,8,x,t);
+    o = FbInU(a,16,x,t);
+    p = FbInU(a,24,x,t);
     return m|n|o|p;
 }
 
@@ -610,7 +610,7 @@
     cs = fbCombineMaskC (src, msk);
     d = (*dst->fetch) (dst);
     s = cs.value;
-    ad = cs.alpha;
+    ad = ~cs.alpha;
     as = d >> 24;
     m = FbGen(s,d,0,as,FbGet8(ad,0),t,u,v);
     n = FbGen(s,d,8,as,FbGet8(ad,8),t,u,v);
@@ -700,10 +700,10 @@
     s = cs.value;
     ad = ~cs.alpha;
     as = ~d >> 24;
-    m = FbGen(s,d,0,as,ad,t,u,v);
-    n = FbGen(s,d,8,as,ad,t,u,v);
-    o = FbGen(s,d,16,as,ad,t,u,v);
-    p = FbGen(s,d,24,as,ad,t,u,v);
+    m = FbGen(s,d,0,as,FbGet8(ad,0),t,u,v);
+    n = FbGen(s,d,8,as,FbGet8(ad,8),t,u,v);
+    o = FbGen(s,d,16,as,FbGet8(ad,16),t,u,v);
+    p = FbGen(s,d,24,as,FbGet8(ad,24),t,u,v);
     (*dst->store) (dst, m|n|o|p);
 }
 
@@ -759,93 +759,6 @@
     }
 }
 
-void
-fbCombineSaturateU (FbCompositeOperand   *src,
-		    FbCompositeOperand   *msk,
-		    FbCompositeOperand   *dst)
-{
-    CARD32  s = fbCombineMaskU (src, msk), d;
-#if 0
-    CARD16  sa, da;
-    CARD16  ad, as;
-    CARD16  t;
-    CARD32  m,n,o,p;
-    
-    d = (*dst->fetch) (dst);
-    sa = s >> 24;
-    da = ~d >> 24;
-    if (sa <= da)
-    {
-	m = FbAdd(s,d,0,t);
-	n = FbAdd(s,d,8,t);
-	o = FbAdd(s,d,16,t);
-	p = FbAdd(s,d,24,t);
-    }
-    else
-    {
-	as = (da << 8) / sa;
-	ad = 0xff;
-	m = FbGen(s,d,0,as,ad,t,u,v);
-	n = FbGen(s,d,8,as,ad,t,u,v);
-	o = FbGen(s,d,16,as,ad,t,u,v);
-	p = FbGen(s,d,24,as,ad,t,u,v);
-    }
-    (*dst->store) (dst, m|n|o|p);
-#else
-    if ((s >> 24) == 0xff)
-	(*dst->store) (dst, s);
-    else
-    {
-	d = (*dst->fetch) (dst);
-	if ((s >> 24) > (d >> 24))
-	    (*dst->store) (dst, s);
-    }
-#endif
-}
-
-void
-fbCombineSaturateC (FbCompositeOperand   *src,
-		    FbCompositeOperand   *msk,
-		    FbCompositeOperand   *dst)
-{
-    FbCompSrc	cs;
-    CARD32  s, d;
-    CARD16  sa, sr, sg, sb, da;
-    CARD16  t, u, v;
-    CARD32  m,n,o,p;
-    
-    cs = fbCombineMaskC (src, msk);
-    d = (*dst->fetch) (dst);
-    s = cs.value;
-    sa = (cs.alpha >> 24) & 0xff;
-    sr = (cs.alpha >> 16) & 0xff;
-    sg = (cs.alpha >>  8) & 0xff;
-    sb = (cs.alpha      ) & 0xff;
-    da = ~d >> 24;
-    
-    if (sb <= da)
-	m = FbAdd(s,d,0,t);
-    else
-	m = FbGen (s, d, 0, (da << 8) / sb, 0xff, t, u, v);
-    
-    if (sg <= da)
-	n = FbAdd(s,d,8,t);
-    else
-	n = FbGen (s, d, 8, (da << 8) / sg, 0xff, t, u, v);
-    
-    if (sr < da)
-	o = FbAdd(s,d,16,t);
-    else
-	o = FbGen (s, d, 16, (da << 8) / sr, 0xff, t, u, v);
-
-    if (sa <= da)
-	p = FbAdd(s,d,24,t);
-    else
-	p = FbGen (s, d, 24, (da << 8) / sa, 0xff, t, u, v);
-    
-    (*dst->store) (dst, m|n|o|p);
-}
-
 /*
  * All of the disjoint composing functions
 
@@ -879,8 +792,8 @@
 #define CombineClear	0
 #define CombineA	(CombineAOut|CombineAIn)
 #define CombineB	(CombineBOut|CombineBIn)
-#define CombineAOver	(CombineAOut|CombineBOut|CombineAIn)
-#define CombineBOver	(CombineAOut|CombineBOut|CombineBIn)
+#define CombineAOver	(CombineA   |CombineBOut)
+#define CombineBOver	(CombineAOut|CombineB)
 #define CombineAAtop	(CombineBOut|CombineAIn)
 #define CombineBAtop	(CombineAOut|CombineBIn)
 #define CombineXor	(CombineAOut|CombineBOut)
@@ -974,8 +887,8 @@
     FbCompSrc	cs;
     CARD32  s, d;
     CARD32  m,n,o,p;
-    CARD32  Fa;
-    CARD16  Fb, t, u, v;
+    CARD32  Fa, Fb;
+    CARD32  t, u, v;
     CARD32  sa;
     CARD8   da;
 
@@ -998,10 +911,10 @@
 	Fa = m|n|o|p;
 	break;
     case CombineAIn:
-	m = fbCombineDisjointOutPart ((CARD8) (sa >> 0), da);
-	n = fbCombineDisjointOutPart ((CARD8) (sa >> 8), da) << 8;
-	o = fbCombineDisjointOutPart ((CARD8) (sa >> 16), da) << 16;
-	p = fbCombineDisjointOutPart ((CARD8) (sa >> 24), da) << 24;
+	m = fbCombineDisjointInPart ((CARD8) (sa >> 0), da);
+	n = fbCombineDisjointInPart ((CARD8) (sa >> 8), da) << 8;
+	o = fbCombineDisjointInPart ((CARD8) (sa >> 16), da) << 16;
+	p = fbCombineDisjointInPart ((CARD8) (sa >> 24), da) << 24;
 	Fa = m|n|o|p;
 	break;
     case CombineA:
@@ -1014,19 +927,27 @@
 	Fb = 0;
 	break;
     case CombineBOut:
-	Fb = fbCombineDisjointOutPart (da, sa);
+	m = fbCombineDisjointOutPart (da, (CARD8) (sa >> 0));
+	n = fbCombineDisjointOutPart (da, (CARD8) (sa >> 8)) << 8;
+	o = fbCombineDisjointOutPart (da, (CARD8) (sa >> 16)) << 16;
+	p = fbCombineDisjointOutPart (da, (CARD8) (sa >> 24)) << 24;
+	Fb = m|n|o|p;
 	break;
     case CombineBIn:
-	Fb = fbCombineDisjointInPart (da, sa);
+	m = fbCombineDisjointInPart (da, (CARD8) (sa >> 0));
+	n = fbCombineDisjointInPart (da, (CARD8) (sa >> 8)) << 8;
+	o = fbCombineDisjointInPart (da, (CARD8) (sa >> 16)) << 16;
+	p = fbCombineDisjointInPart (da, (CARD8) (sa >> 24)) << 24;
+	Fb = m|n|o|p;
 	break;
     case CombineB:
-	Fb = 0xff;
+	Fb = 0xffffffff;
 	break;
     }
-    m = FbGen (s,d,0,FbGet8(Fa,0),Fb,t,u,v);
-    n = FbGen (s,d,8,FbGet8(Fa,8),Fb,t,u,v);
-    o = FbGen (s,d,16,FbGet8(Fa,16),Fb,t,u,v);
-    p = FbGen (s,d,24,FbGet8(Fa,24),Fb,t,u,v);
+    m = FbGen (s,d,0,FbGet8(Fa,0),FbGet8(Fb,0),t,u,v);
+    n = FbGen (s,d,8,FbGet8(Fa,8),FbGet8(Fb,8),t,u,v);
+    o = FbGen (s,d,16,FbGet8(Fa,16),FbGet8(Fb,16),t,u,v);
+    p = FbGen (s,d,24,FbGet8(Fa,24),FbGet8(Fb,24),t,u,v);
     s = m|n|o|p;
     (*dst->store) (dst, s);
 }
@@ -1283,8 +1204,8 @@
     FbCompSrc	cs;
     CARD32  s, d;
     CARD32  m,n,o,p;
-    CARD32  Fa;
-    CARD16  Fb, t, u, v;
+    CARD32  Fa, Fb;
+    CARD16  t, u, v;
     CARD32  sa;
     CARD8   da;
 
@@ -1307,10 +1228,10 @@
 	Fa = m|n|o|p;
 	break;
     case CombineAIn:
-	m = fbCombineConjointOutPart ((CARD8) (sa >> 0), da);
-	n = fbCombineConjointOutPart ((CARD8) (sa >> 8), da) << 8;
-	o = fbCombineConjointOutPart ((CARD8) (sa >> 16), da) << 16;
-	p = fbCombineConjointOutPart ((CARD8) (sa >> 24), da) << 24;
+	m = fbCombineConjointInPart ((CARD8) (sa >> 0), da);
+	n = fbCombineConjointInPart ((CARD8) (sa >> 8), da) << 8;
+	o = fbCombineConjointInPart ((CARD8) (sa >> 16), da) << 16;
+	p = fbCombineConjointInPart ((CARD8) (sa >> 24), da) << 24;
 	Fa = m|n|o|p;
 	break;
     case CombineA:
@@ -1323,19 +1244,27 @@
 	Fb = 0;
 	break;
     case CombineBOut:
-	Fb = fbCombineConjointOutPart (da, sa);
+	m = fbCombineConjointOutPart (da, (CARD8) (sa >> 0));
+	n = fbCombineConjointOutPart (da, (CARD8) (sa >> 8)) << 8;
+	o = fbCombineConjointOutPart (da, (CARD8) (sa >> 16)) << 16;
+	p = fbCombineConjointOutPart (da, (CARD8) (sa >> 24)) << 24;
+	Fb = m|n|o|p;
 	break;
     case CombineBIn:
-	Fb = fbCombineConjointInPart (da, sa);
+	m = fbCombineConjointInPart (da, (CARD8) (sa >> 0));
+	n = fbCombineConjointInPart (da, (CARD8) (sa >> 8)) << 8;
+	o = fbCombineConjointInPart (da, (CARD8) (sa >> 16)) << 16;
+	p = fbCombineConjointInPart (da, (CARD8) (sa >> 24)) << 24;
+	Fb = m|n|o|p;
 	break;
     case CombineB:
-	Fb = 0xff;
+	Fb = 0xffffffff;
 	break;
     }
-    m = FbGen (s,d,0,FbGet8(Fa,0),Fb,t,u,v);
-    n = FbGen (s,d,8,FbGet8(Fa,8),Fb,t,u,v);
-    o = FbGen (s,d,16,FbGet8(Fa,16),Fb,t,u,v);
-    p = FbGen (s,d,24,FbGet8(Fa,24),Fb,t,u,v);
+    m = FbGen (s,d,0,FbGet8(Fa,0),FbGet8(Fb,0),t,u,v);
+    n = FbGen (s,d,8,FbGet8(Fa,8),FbGet8(Fb,8),t,u,v);
+    o = FbGen (s,d,16,FbGet8(Fa,16),FbGet8(Fb,16),t,u,v);
+    p = FbGen (s,d,24,FbGet8(Fa,24),FbGet8(Fb,24),t,u,v);
     s = m|n|o|p;
     (*dst->store) (dst, s);
 }
@@ -1521,7 +1450,7 @@
     fbCombineAtopReverseU,
     fbCombineXorU,
     fbCombineAddU,
-    fbCombineDisjointOverU, /* Saturate */
+    fbCombineDisjointOverReverseU, /* Saturate */
     0,
     0,
     fbCombineClear,
@@ -1568,7 +1497,7 @@
     fbCombineAtopReverseC,
     fbCombineXorC,
     fbCombineAddC,
-    fbCombineDisjointOverC, /* Saturate */
+    fbCombineDisjointOverReverseC, /* Saturate */
     0,
     0,
     fbCombineClear,	    /* 0x10 */
Index: fbpict.h
===================================================================
RCS file: /cvs/xserver/xserver/fb/fbpict.h,v
retrieving revision 1.16
diff -u -r1.16 fbpict.h
--- fbpict.h	15 Jan 2004 09:09:29 -0000	1.16
+++ fbpict.h	18 Feb 2004 18:52:15 -0000
@@ -295,15 +295,8 @@
 	       FbCompositeOperand    *msk,
 	       FbCompositeOperand    *dst);
 
-void
-fbCombineSaturateU (FbCompositeOperand   *src,
-		    FbCompositeOperand   *msk,
-		    FbCompositeOperand   *dst);
-
-void
-fbCombineSaturateC (FbCompositeOperand   *src,
-		    FbCompositeOperand   *msk,
-		    FbCompositeOperand   *dst);
+#define fbCombineSaturateU fbCombineDisjointOverReverseU
+#define fbCombineSaturateC fbCombineDisjointOverReverseC
 
 CARD8
 fbCombineDisjointOutPart (CARD8 a, CARD8 b);

--0-14632160-1077546971=:46914--