[Mesa-dev] [PATCH] st/xa: Use PIPE_FORMAT_R8_UNORM when available

Jose Fonseca jfonseca at vmware.com
Thu Sep 17 04:37:22 PDT 2015


On 17/09/15 10:58, Thomas Hellstrom wrote:
> On 09/17/2015 11:53 AM, Thomas Hellstrom wrote:
>> On 09/17/2015 11:34 AM, Jose Fonseca wrote:
>>> On 16/09/15 14:04, Thomas Hellstrom wrote:
>>>> XA has been using L8_UNORM for a8 and yuv component surfaces.
>>>> This commit instead makes XA prefer R8_UNORM since it's assumed to
>>>> have a
>>>> higher availability.
>>>>
>>>> Also neither of these formats are suitable as destination formats using
>>>> destination alpha blending, so reject those operations.
>>>>
>>>> Signed-off-by: Thomas Hellstrom <thellstrom at vmware.com>
>>>> ---
>>>>    src/gallium/state_trackers/xa/xa_composite.c | 40
>>>> ++++++++++------------------
>>>>    src/gallium/state_trackers/xa/xa_tracker.c   | 28 +++++++++++++------
>>>>    2 files changed, 34 insertions(+), 34 deletions(-)
>>>>
>>>> diff --git a/src/gallium/state_trackers/xa/xa_composite.c
>>>> b/src/gallium/state_trackers/xa/xa_composite.c
>>>> index 7cfd1e1..e81eeba 100644
>>>> --- a/src/gallium/state_trackers/xa/xa_composite.c
>>>> +++ b/src/gallium/state_trackers/xa/xa_composite.c
>>>> @@ -78,26 +78,6 @@ static const struct xa_composite_blend xa_blends[]
>>>> = {
>>>>          0, 0, PIPE_BLENDFACTOR_ONE, PIPE_BLENDFACTOR_ONE},
>>>>    };
>>>>
>>>> -
>>>> -/*
>>>> - * The alpha value stored in a luminance texture is read by the
>>>> - * hardware as color.
>>>> - */
>>>> -static unsigned
>>>> -xa_convert_blend_for_luminance(unsigned factor)
>>>> -{
>>>> -    switch(factor) {
>>>> -    case PIPE_BLENDFACTOR_DST_ALPHA:
>>>> -    return PIPE_BLENDFACTOR_DST_COLOR;
>>>> -    case PIPE_BLENDFACTOR_INV_DST_ALPHA:
>>>> -    return PIPE_BLENDFACTOR_INV_DST_COLOR;
>>>> -    default:
>>>> -    break;
>>>> -    }
>>>> -    return factor;
>>>> -}
>>>> -
>>>> -
>>>>    static boolean
>>>>    blend_for_op(struct xa_composite_blend *blend,
>>>>             enum xa_composite_op op,
>>>> @@ -131,10 +111,16 @@ blend_for_op(struct xa_composite_blend *blend,
>>>>        if (!dst_pic->srf)
>>>>        return supported;
>>>>
>>>> -    if (dst_pic->srf->tex->format == PIPE_FORMAT_L8_UNORM) {
>>>> -    blend->rgb_src = xa_convert_blend_for_luminance(blend->rgb_src);
>>>> -    blend->rgb_dst = xa_convert_blend_for_luminance(blend->rgb_dst);
>>>> -    }
>>>> +    /*
>>>> +     * None of the hardware formats we might use for dst A8 are
>>>> +     * suitable for dst_alpha blending, since they present the
>>>> +     * alpha channel either in all color channels (L8_UNORM) or
>>>> +     * in the red channel only (R8_UNORM)
>>>> +     */
>>>> +    if ((dst_pic->srf->tex->format == PIPE_FORMAT_L8_UNORM ||
>>>> +         dst_pic->srf->tex->format == PIPE_FORMAT_R8_UNORM) &&
>>>> +        blend->alpha_dst)
>>>> +        return FALSE;
>>> I'm not very familiar with this code, but wasn't
>>> xa_convert_blend_for_luminance compensating for the A8 <-> L8
>>> mismatch?  It looks like it was doing the right thing.   And
>>> xa_convert_blend_for_luminance would work both for L8 and R8.
>> In these operations since the destination format is A8, we're only
>> interested in the resulting alpha channel. With
>> PIPE_BLENDFACTOR_DST_ALPHA, we would use the destination alpha channel
>> for blending, which would pick up 1 for L8 and R8 which is obviously
>> wrong. Now the removed function instead set PIPE_BLENDFACTOR_DST_COLOR,
>> which would, if I read the specs correctly blend component-wise and
>> yield the correct results for the R, G and B channels if L8 is used. and
>> for the R channel only if R8 is used. But a prerequisite here is that
>> the destination logical format is A8 and the alpha channel is never
>> correct AFAICT.
>>
> Hmm, or are you making the point that blending takes place when we've
> already swizzled the alpha value to the red channel? Yes, then you're
> obviously right, and I need to revert that "fix" ;).

Yeah, my understanding is that we're emulating A8 with L8/R8, hence 
logical alpha is in physical red.  Hence DST_ALPHA -> DST_RED, etc..

Jose



More information about the mesa-dev mailing list