Acked-by: Mart Raudsepp <[email protected]> On P, 2010-06-13 at 18:47 +0800, Huang, FrankR wrote: > From: Frank Huang <[email protected]> > > Bring all the "return FALSE" condition forward from lx_prepare_composite > to lx_check_composite. The Xserver will handle this condition. See more > on Freedesktop Bugzilla #27243 > > Signed-off-by: Frank Huang <[email protected]> > --- > src/lx_exa.c | 52 +++++++++++++++++++++++++++++----------------------- > 1 files changed, 29 insertions(+), 23 deletions(-) > > diff --git a/src/lx_exa.c b/src/lx_exa.c > index b267cc0..ab33124 100644 > --- a/src/lx_exa.c > +++ b/src/lx_exa.c > @@ -536,12 +536,15 @@ static Bool > lx_check_composite(int op, PicturePtr pSrc, PicturePtr pMsk, PicturePtr pDst) > { > GeodeRec *pGeode = GEODEPTR_FROM_PICTURE(pDst); > + const struct exa_format_t *srcFmt, *dstFmt; > > /* Check that the operation is supported */ > > if (op > PictOpAdd) > return FALSE; > > + /* We need the off-screen buffer to do the multipass work */ > + > if (usesPasses(op)) { > if (pGeode->exaBfrOffset == 0 || !pMsk) > return FALSE; > @@ -583,21 +586,23 @@ lx_check_composite(int op, PicturePtr pSrc, PicturePtr > pMsk, PicturePtr pDst) > return FALSE; > > if (pMsk && op != PictOpClear) { > + struct blend_ops_t *opPtr = &lx_alpha_ops[op * 2]; > + int direction = (opPtr->channel == CIMGP_CHANNEL_A_SOURCE) ? 0 : 1; > + > + /* Direction 0 indicates src->dst, 1 indiates dst->src */ > + if (((direction == 0) && (pSrc->pDrawable->bitsPerPixel < 16)) || > + ((direction == 1) && (pDst->pDrawable->bitsPerPixel < 16))) { > + ErrorF("Can't do mask blending with less then 16bpp\n"); > + return FALSE; > + } > /* We can only do masks with a 8bpp or a 4bpp mask */ > if (pMsk->format != PICT_a8 && pMsk->format != PICT_a4) > return FALSE; > + /* The pSrc should be 1x1 pixel if the pMsk is not zero */ > + if (pSrc->pDrawable->width != 1 || pSrc->pDrawable->height != 1) > + return FALSE; > } > > - return TRUE; > -} > - > -static Bool > -lx_prepare_composite(int op, PicturePtr pSrc, PicturePtr pMsk, > - PicturePtr pDst, PixmapPtr pxSrc, PixmapPtr pxMsk, PixmapPtr pxDst) > -{ > - GeodeRec *pGeode = GEODEPTR_FROM_PIXMAP(pxDst); > - const struct exa_format_t *srcFmt, *dstFmt; > - > /* Get the formats for the source and destination */ > > if ((srcFmt = lx_get_format(pSrc)) == NULL) { > @@ -631,6 +636,20 @@ lx_prepare_composite(int op, PicturePtr pSrc, PicturePtr > pMsk, > ErrorF("EXA: Can't rotate and convert formats at the same time\n"); > return FALSE; > } > + return TRUE; > +} > + > +static Bool > +lx_prepare_composite(int op, PicturePtr pSrc, PicturePtr pMsk, > + PicturePtr pDst, PixmapPtr pxSrc, PixmapPtr pxMsk, PixmapPtr pxDst) > +{ > + GeodeRec *pGeode = GEODEPTR_FROM_PIXMAP(pxDst); > + const struct exa_format_t *srcFmt, *dstFmt; > + > + /* Get the formats for the source and destination */ > + > + srcFmt = lx_get_format(pSrc); > + dstFmt = lx_get_format(pDst); > > /* Set up the scratch buffer with the information we need */ > > @@ -644,14 +663,6 @@ lx_prepare_composite(int op, PicturePtr pSrc, PicturePtr > pMsk, > struct blend_ops_t *opPtr = &lx_alpha_ops[op * 2]; > int direction = (opPtr->channel == CIMGP_CHANNEL_A_SOURCE) ? 0 : 1; > > - /* Direction 0 indicates src->dst, 1 indiates dst->src */ > - > - if (((direction == 0) && (pxSrc->drawable.bitsPerPixel < 16)) || > - ((direction == 1) && (pxDst->drawable.bitsPerPixel < 16))) { > - ErrorF("Can't do mask blending with less then 16bpp\n"); > - return FALSE; > - } > - > /* Get the source color */ > > if (direction == 0) > @@ -661,11 +672,6 @@ lx_prepare_composite(int op, PicturePtr pSrc, PicturePtr > pMsk, > exaScratch.srcColor = lx_get_source_color(pxDst, pDst->format, > pSrc->format); > > - /* FIXME: What to do here? */ > - > - if (pSrc->pDrawable->width != 1 || pSrc->pDrawable->height != 1) > - return FALSE; > - > /* Save off the info we need (reuse the source values to save space) */ > > exaScratch.type = COMP_TYPE_MASK;
_______________________________________________ Xorg-driver-geode mailing list [email protected] http://lists.x.org/mailman/listinfo/xorg-driver-geode
