On Mon, 2013-07-22 at 06:06 +0200, Grigori Goronzy wrote:
> Subpixel text rendering is typically done with a solid src and a
> pixmap mask. Traditionally, this cannot be accelerated in a single
> pass and requires two passes [1]. However, we can cheat a little
> with a constant blend color.
> 
> We can use:
> 
> const.A = src.A / src.A
> const.R = src.R / src.A
> const.G = src.G / src.A
> const.B = src.B / src.A
> 
> dst.A = const.A * (src.A * mask.A) + (1 - (src.A * mask.A)) * dst.A
> dst.R = const.R * (src.A * mask.R) + (1 - (src.A * mask.R)) * dst.R
> dst.G = const.G * (src.A * mask.G) + (1 - (src.A * mask.G)) * dst.G
> dst.B = const.B * (src.A * mask.B) + (1 - (src.A * mask.B)) * dst.B
> 
> This only needs a single source value. src.A is cancelled down in
> the right places.
> 
> [1] http://anholt.livejournal.com/32058.html

Like Roland, I wonder if this trick couldn't be done in EXA instead of
in the driver?


> diff --git a/src/evergreen_exa.c b/src/evergreen_exa.c
> index 5b8a631..ee5b06b 100644
> --- a/src/evergreen_exa.c
> +++ b/src/evergreen_exa.c
> @@ -704,6 +704,14 @@ static uint32_t EVERGREENGetBlendCntl(int op, PicturePtr 
> pMask, uint32_t dst_for
>       } else if (dblend == (BLEND_ONE_MINUS_SRC_ALPHA << 
> COLOR_DESTBLEND_shift)) {
>           dblend = (BLEND_ONE_MINUS_SRC_COLOR << COLOR_DESTBLEND_shift);
>       }
> +
> +     /* With some tricks, we can still accelerate PictOpOver with solid src.
> +      * This is commonly used for text rendering, so it's worth the extra
> +      * effort.
> +      */
> +     if (sblend == (BLEND_ONE << COLOR_SRCBLEND_shift)) {
> +         sblend = (BLEND_CONSTANT_COLOR << COLOR_SRCBLEND_shift);
> +     }

Is this correct for all cases where (sblend == (BLEND_ONE <<
COLOR_SRCBLEND_shift))?


>               if (EVERGREENBlendOp[op].src_alpha &&
>                   (EVERGREENBlendOp[op].blend_cntl & COLOR_SRCBLEND_mask) !=
>                   (BLEND_ZERO << COLOR_SRCBLEND_shift)) {
> -                 RADEON_FALLBACK(("Component alpha not supported with source 
> "
> -                                  "alpha and source value blending.\n"));
> +                 if (pSrcPicture->pDrawable || op != 3)
> +                     RADEON_FALLBACK(("Component alpha not supported with 
> source "
> +                                      "alpha and source value blending.\n"));
>               }
>           }

Please use PictOpOver instead of the magic number 3.


-- 
Earthling Michel Dänzer           |                   http://www.amd.com
Libre software enthusiast         |          Debian, X and DRI developer
_______________________________________________
xorg-driver-ati mailing list
[email protected]
http://lists.x.org/mailman/listinfo/xorg-driver-ati

Reply via email to