[PATCH 4/4] EXA/evergreen/ni: accelerate PictOpOver with component alpha

Alex Deucher alexdeucher at gmail.com
Tue Jul 30 15:58:46 PDT 2013


On Tue, Jul 30, 2013 at 6:55 PM, Grigori Goronzy <greg at chown.ath.cx> wrote:
> On 30.07.2013 17:26, Michel Dänzer wrote:
>>
>>
>> Like Roland, I wonder if this trick couldn't be done in EXA instead of
>> in the driver?
>>
>
> I don't see how, EXA/XRENDER do not know about constant blend colors or
> anything like it. The implementation in the backend is very simple anyway,
> it should be trivial to implement this in drivers that can support it.
>
>
>>
>>> 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))?
>>
>
> Yes. PictOpOver is the only case where we have this kind of src blend with
> src alpha.
>
>
>>
>>>                 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.
>>
>
> Right, I'll send a revised version of the patch.

I've already pushed the original series.  You can provide fixes on top.

Alex


More information about the xorg-driver-ati mailing list