EXA: Handle separate alpha maps in Composite fallback.
Maarten Maathuis
madman2003 at gmail.com
Sun Feb 22 10:12:16 PST 2009
Please name the new indices in a more general way, something like
EXA_PREPARE_AUX1, sometime in the future it might prove convient to
have them for other purposes as well. A minor bump is probably nice,
the question is, should the new indices be used on drivers claiming an
older minor version? A major bump would avoid this problem, but might
be overdone?
Maarten.
On Sun, Feb 22, 2009 at 4:40 PM, Michel Dänzer <michel at daenzer.net> wrote:
> From: Michel Dänzer <daenzer at vmware.com>
>
> Fixes https://bugs.freedesktop.org/show_bug.cgi?id=18710 .
>
> Signed-off-by: Michel Dänzer <daenzer at vmware.com>
> ---
> exa/exa.h | 4 ++++
> exa/exa_unaccel.c | 23 +++++++++++++++++++++++
> 2 files changed, 27 insertions(+), 0 deletions(-)
>
> A couple of doubts:
>
> * Can we just add new PrepareAccess indices like this, or do we need to bump
> the EXA major/minor version?
> * Does the separate alpha map matter for the Composite destination?
>
> diff --git a/exa/exa.h b/exa/exa.h
> index 21a0f1a..8f5d49c 100644
> --- a/exa/exa.h
> +++ b/exa/exa.h
> @@ -672,6 +672,10 @@ typedef struct _ExaDriver {
> * from.
> */
> #define EXA_PREPARE_MASK 2
> +
> + #define EXA_PREPARE_ALPHAMAP_DEST 3
> + #define EXA_PREPARE_ALPHAMAP_SRC 4
> + #define EXA_PREPARE_ALPHAMAP_MASK 5
> /** @} */
>
> /**
> diff --git a/exa/exa_unaccel.c b/exa/exa_unaccel.c
> index c821f0d..4530e15 100644
> --- a/exa/exa_unaccel.c
> +++ b/exa/exa_unaccel.c
> @@ -387,6 +387,7 @@ ExaCheckComposite (CARD8 op,
> PictureScreenPtr ps = GetPictureScreen(pScreen);
> #endif /* RENDER */
> ExaScreenPriv(pScreen);
> + ExaPixmapPrivPtr pExaDstAlphaPix = NULL, pExaMaskAlphaPix = NULL, pExaSrcAlphaPix = NULL;
> RegionRec region;
> int xoff, yoff;
>
> @@ -408,13 +409,29 @@ ExaCheckComposite (CARD8 op,
> } else
> exaPrepareAccess (pDst->pDrawable, EXA_PREPARE_DEST);
>
> + if (pDst->alphaMap && pDst->alphaMap->pDrawable) {
> + pExaDstAlphaPix =
> + ExaGetPixmapPriv(exaGetDrawablePixmap(pDst->alphaMap->pDrawable));
> + exaPrepareAccess(pDst->alphaMap->pDrawable, EXA_PREPARE_ALPHAMAP_DEST);
> + }
> +
> EXA_FALLBACK(("from picts %p/%p to pict %p\n",
> pSrc, pMask, pDst));
>
> if (pSrc->pDrawable != NULL)
> exaPrepareAccess (pSrc->pDrawable, EXA_PREPARE_SRC);
> + if (pSrc->alphaMap && pSrc->alphaMap->pDrawable) {
> + pExaSrcAlphaPix =
> + ExaGetPixmapPriv(exaGetDrawablePixmap(pSrc->alphaMap->pDrawable));
> + exaPrepareAccess(pSrc->alphaMap->pDrawable, EXA_PREPARE_ALPHAMAP_SRC);
> + }
> if (pMask && pMask->pDrawable != NULL)
> exaPrepareAccess (pMask->pDrawable, EXA_PREPARE_MASK);
> + if (pMask && pMask->alphaMap && pMask->alphaMap->pDrawable) {
> + pExaMaskAlphaPix =
> + ExaGetPixmapPriv(exaGetDrawablePixmap(pMask->alphaMap->pDrawable));
> + exaPrepareAccess(pMask->alphaMap->pDrawable, EXA_PREPARE_ALPHAMAP_MASK);
> + }
> #ifdef RENDER
> swap(pExaScr, ps, Composite);
> ps->Composite (op,
> @@ -433,9 +450,15 @@ ExaCheckComposite (CARD8 op,
> #endif /* RENDER */
> if (pMask && pMask->pDrawable != NULL)
> exaFinishAccess (pMask->pDrawable, EXA_PREPARE_MASK);
> + if (pExaMaskAlphaPix)
> + exaFinishAccess(pMask->alphaMap->pDrawable, EXA_PREPARE_ALPHAMAP_MASK);
> if (pSrc->pDrawable != NULL)
> exaFinishAccess (pSrc->pDrawable, EXA_PREPARE_SRC);
> + if (pExaSrcAlphaPix)
> + exaFinishAccess(pSrc->alphaMap->pDrawable, EXA_PREPARE_ALPHAMAP_SRC);
> exaFinishAccess (pDst->pDrawable, EXA_PREPARE_DEST);
> + if (pExaDstAlphaPix)
> + exaFinishAccess(pDst->alphaMap->pDrawable, EXA_PREPARE_ALPHAMAP_DEST);
>
> REGION_UNINIT(pScreen, ®ion);
> }
> --
> 1.6.2.rc1
>
>
> _______________________________________________
> xorg-devel mailing list
> xorg-devel at lists.x.org
> http://lists.x.org/mailman/listinfo/xorg-devel
>
More information about the xorg-devel
mailing list