[Xorg-driver-geode] [PATCH 1/7] Prevent the pixmap migration if the geode GP can not do the acceleration.

Mart Raudsepp mart.raudsepp at artecdesign.ee
Wed Jun 16 03:56:22 PDT 2010


Acked-by: Mart Raudsepp <leio at gentoo.org>

On P, 2010-06-13 at 18:47 +0800, Huang, FrankR wrote:
> From: Frank Huang <frankr.huang at amd.com>
> 
> 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 <frankr.huang at amd.com>
> ---
>  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;



More information about the Xorg-driver-geode mailing list