[prev in list] [next in list] [prev in thread] [next in thread] 

List:       freedesktop-xorg
Subject:    Patch for picture.c's ReduceCompositeOp
From:       "John Tapsell" <johnflux () gmail ! com>
Date:       2008-12-05 15:11:32
Message-ID: 43d8ce650812050711j2de52046id0cff4a925f30bd0 () mail ! gmail ! com
[Download RAW message or body]

Hi all,

  Attached is a patch to extend the ReduceCompositeOp function.  This
should speed up any drivers that don't do these optimizations
themselves.

For example, take the operation OverReverse, from an ARGB surface to
an XRGB surface.

PictOp                     Fa                        Fb
OverReverse          1-Ab                      1

For an XRGB surface, Ab is always 1, so this operation becomes:
PictOp                     Fa                        Fb
OverReverse            0                         1

which is the same as the Dst operation.  So when we are told to do an
OverReverse operation to a XRGB surface, we actually just apply the
Dst operation to a ARGB surface.

We can also use that 1/Ab is always >=1  to simplify functions further.

This was tested with ./rendercheck -f a8r8g8b8,x8r8g8b8 -t blend
which passed all tests.

Applies against xorg/xserver

John Tapsell

["0001-Extend-the-ReduceCompositeOp-function-to-map-more-fu.patch" (text/x-diff)]

From 5b53be963a0203750e4636c92da1661420c96488 Mon Sep 17 00:00:00 2001
From: John Tapsell <john.tapsell@john-desktop.(none)>
Date: Fri, 5 Dec 2008 15:07:27 +0000
Subject: [PATCH] Extend the ReduceCompositeOp function to map more functions to their \
equivalents in the case that the source or destination surface has no alpha channel.

---
 render/picture.c |  143 ++++++++++++++++++++++++++++++++++++++++++++++--------
 1 files changed, 123 insertions(+), 20 deletions(-)

diff --git a/render/picture.c b/render/picture.c
index f99c53f..78eaf32 100644
--- a/render/picture.c
+++ b/render/picture.c
@@ -1554,6 +1554,27 @@ ReduceCompositeOp (CARD8 op, PicturePtr pSrc, PicturePtr \
pMask, PicturePtr pDst,  {
     Bool no_src_alpha, no_dst_alpha;
 
+    /* Reduce some con/disjoint ops to the basic names. */
+    switch (op) {
+    case PictOpClear:
+    case PictOpDisjointClear:
+    case PictOpConjointClear:
+	return PictOpClear;
+	break;
+    case PictOpSrc:
+    case PictOpDisjointSrc:
+    case PictOpConjointSrc:
+	return PictOpSrc;
+	break;
+    case PictOpDst:
+    case PictOpDisjointDst:
+    case PictOpConjointDst:
+	return PictOpDst;
+	break;
+    default:
+	break;
+    }
+
     /* Sampling off the edge of a RepeatNone picture introduces alpha
      * even if the picture itself doesn't have alpha. We don't try to
      * detect every case where we don't sample off the edge, just the
@@ -1573,8 +1594,6 @@ ReduceCompositeOp (CARD8 op, PicturePtr pSrc, PicturePtr pMask, \
PicturePtr pDst,  PICT_FORMAT_A(pDst->format) == 0 &&
                    pDst->alphaMap == NULL;
 
-    /* TODO, maybe: Conjoint and Disjoint op reductions? */
- 
     /* Deal with simplifications where the source alpha is always 1. */
     if (no_src_alpha)
     {
@@ -1597,6 +1616,63 @@ ReduceCompositeOp (CARD8 op, PicturePtr pSrc, PicturePtr \
pMask, PicturePtr pDst,  case PictOpXor:
 	    op = PictOpOut;
 	    break;
+	case PictOpSaturate:
+	    op = PictOpOverReverse;
+	    break;
+	case PictOpDisjointOver:
+	    op = PictOpSrc;
+	    break;
+	case PictOpDisjointOverReverse:
+	    op = PictOpOverReverse;
+	    break;
+	case PictOpDisjointIn:
+	    op = PictOpIn;
+	    break;
+	case PictOpDisjointInReverse:
+	    op = PictOpDst;
+	    break;
+	case PictOpDisjointOut:
+	    op = PictOpOut;
+	    break;
+	case PictOpDisjointOutReverse:
+	    op = PictOpClear;
+	    break;
+	case PictOpDisjointAtop:
+	    op = PictOpIn;
+	    break;
+	case PictOpDisjointAtopReverse:
+	    op = PictOpOverReverse;
+	    break;
+	case PictOpDisjointXor:
+	    op = PictOpOut;
+	    break;
+	case PictOpConjointOver:
+	    op = PictOpSrc;
+	    break;
+	case PictOpConjointOverReverse:
+	    op = PictOpOverReverse;
+	    break;
+	case PictOpConjointIn:
+	    op = PictOpIn;
+	    break;
+	case PictOpConjointInReverse:
+	    op = PictOpDst;
+	    break;
+	case PictOpConjointOut:
+	    op = PictOpOut;
+	    break;
+	case PictOpConjointOutReverse:
+	    op = PictOpClear;
+	    break;
+	case PictOpConjointAtop:
+	    op = PictOpIn;
+	    break;
+	case PictOpConjointAtopReverse:
+	    op = PictOpOverReverse;
+	    break;
+	case PictOpConjointXor:
+	    op = PictOpOut;
+	    break;
 	default:
 	    break;
 	}
@@ -1618,32 +1694,59 @@ ReduceCompositeOp (CARD8 op, PicturePtr pSrc, PicturePtr \
pMask, PicturePtr pDst,  case PictOpAtop:
 	    op = PictOpOver;
 	    break;
+	case PictOpAtopReverse:
+	    op = PictOpInReverse;
+	    break;
 	case PictOpXor:
 	    op = PictOpOutReverse;
 	    break;
+	case PictOpSaturate:
+	    op = PictOpDst;
+	    break;
+	case PictOpDisjointOver:
+	    op = PictOpOver;
+	    break;
+	case PictOpDisjointOverReverse:
+	    op = PictOpDst;
+	    break;
+	case PictOpDisjointIn:
+	    op = PictOpSrc;
+	    break;
+	case PictOpDisjointInReverse:
+	    op = PictOpInReverse;
+	    break;
+	case PictOpDisjointOut:
+	    op = PictOpClear;
+	    break;
+	case PictOpDisjointOutReverse:
+	    op = PictOpOutReverse;
+	    break;
+	case PictOpDisjointAtop:
+	    op = PictOpOver;
+	    break;
+	case PictOpDisjointAtopReverse:
+	    op = PictOpInReverse;
+	    break;
+	case PictOpDisjointXor:
+	    op = PictOpOutReverse;
+	    break;
+	case PictOpConjointClear:
+	    op = PictOpClear;
+	    break;
+	case PictOpConjointOver:
+	    op = PictOpOver;
+	    break;
+	case PictOpConjointInReverse:
+	    op = PictOpInReverse;
+	    break;
+	case PictOpConjointOutReverse:
+	    op = PictOpOutReverse;
+	    break;
 	default:
 	    break;
 	}
     }
 
-    /* Reduce some con/disjoint ops to the basic names. */
-    switch (op) {
-    case PictOpDisjointClear:
-    case PictOpConjointClear:
-	op = PictOpClear;
-	break;
-    case PictOpDisjointSrc:
-    case PictOpConjointSrc:
-	op = PictOpSrc;
-	break;
-    case PictOpDisjointDst:
-    case PictOpConjointDst:
-	op = PictOpDst;
-	break;
-    default:
-	break;
-    }
-
     return op;
 }
 
-- 
1.5.4.3



_______________________________________________
xorg mailing list
xorg@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/xorg

[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic