Signed-off-by: Francisco Jerez <[email protected]>
---
 src/nv10_exa.c |   52 ++++++++++++++++++++++++++++------------------------
 1 files changed, 28 insertions(+), 24 deletions(-)

diff --git a/src/nv10_exa.c b/src/nv10_exa.c
index 71184b1..4027982 100644
--- a/src/nv10_exa.c
+++ b/src/nv10_exa.c
@@ -123,10 +123,6 @@ static Bool NV10CheckBuffer(PicturePtr Picture)
 
 static Bool NV10CheckPictOp(int op)
 {
-       if ( op == PictOpAtopReverse ) /*this op doesn't work*/
-               {
-               return FALSE;
-               }
        if ( op >= PictOpSaturate )
                { /*we do no saturate, disjoint, conjoint, though we could do 
e.g. DisjointClear which really is Clear*/
                return FALSE;
@@ -595,14 +591,24 @@ static void NV10SetPictOp(NVPtr pNv,int op)
                {0x0305,0x0000}, /* PictOpOut */
                {0x0000,0x0303}, /* PictOpOutReverse */
                {0x0304,0x0303}, /* PictOpAtop */
-               {0x0305,0x0302}, /* PictOpAtopReverse - DOES NOT WORK*/
+               {0x0305,0x0302}, /* PictOpAtopReverse */
                {0x0305,0x0303}, /* PictOpXor */
                {0x0001,0x0001}, /* PictOpAdd */
        };
+       int src_factor = pictops[op].src;
+       int dst_factor = pictops[op].dst;
        
+       if (src_factor == NV10TCL_BLEND_FUNC_SRC_ONE_MINUS_DST_ALPHA &&
+           !PICT_FORMAT_A(pNv->pdpict->format))
+               /* ONE_MINUS_DST_ALPHA doesn't always do the right thing for
+                * framebuffers without alpha channel. But it's the same as
+                * ZERO in that case.
+                */
+               src_factor = NV10TCL_BLEND_FUNC_SRC_ZERO;
+
        BEGIN_RING(chan, celcius, NV10TCL_BLEND_FUNC_SRC, 2);
-       OUT_RING  (chan, pictops[op].src);
-       OUT_RING  (chan, pictops[op].dst);
+       OUT_RING  (chan, src_factor);
+       OUT_RING  (chan, dst_factor);
        BEGIN_RING(chan, celcius, NV10TCL_BLEND_FUNC_ENABLE, 1);
        OUT_RING  (chan, 1);
 }
@@ -631,19 +637,27 @@ Bool NV10EXAPrepareComposite(int op,
 
        WAIT_RING(chan, 128);
 
-       if 
(NV10Check_A8plusA8_Feasability(pSrcPicture,pMaskPicture,pDstPicture,op))
-               {
-               state.have_mask = FALSE;
+       state.is_a8_plus_a8 = FALSE;
+       state.have_mask=(pMaskPicture!=NULL);
+
+       pNv->alu = op;
+       pNv->pspict = pSrcPicture;
+       pNv->pmpict = pMaskPicture;
+       pNv->pdpict = pDstPicture;
+       pNv->pspix = pSrc;
+       pNv->pmpix = pMask;
+       pNv->pdpix = pDst;
+       chan->flush_notify = NV10StateCompositeReemit;
+
+       if 
(NV10Check_A8plusA8_Feasability(pSrcPicture,pMaskPicture,pDstPicture,op)) {
                state.is_a8_plus_a8 = TRUE;
                NV10SetBuffer(pNv,pDstPicture,pDst);
                NV10SetPictOp(pNv, op);
                NV10SetTexture(pNv, 0, pSrcPicture, pSrc);
                NV10SetTexture(pNv, 1, pSrcPicture, pSrc);
                return TRUE;
-               }
-       
-       state.is_a8_plus_a8 = FALSE;
-               
+       }
+
        /* Set dst format */
        NV10SetBuffer(pNv,pDstPicture,pDst);
 
@@ -659,16 +673,6 @@ Bool NV10EXAPrepareComposite(int op,
        /* Set PictOp */
        NV10SetPictOp(pNv, op);
 
-
-       pNv->alu = op;
-       pNv->pspict = pSrcPicture;
-       pNv->pmpict = pMaskPicture;
-       pNv->pdpict = pDstPicture;
-       pNv->pspix = pSrc;
-       pNv->pmpix = pMask;
-       pNv->pdpix = pDst;
-       chan->flush_notify = NV10StateCompositeReemit;
-       state.have_mask=(pMaskPicture!=NULL);
        return TRUE;
 }
 
-- 
1.6.3.3

_______________________________________________
Nouveau mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/nouveau

Reply via email to