[PATCH v2] drm/amd/display: add Coverage blend mode for overlay plane
Harry Wentland
harry.wentland at amd.com
Fri May 20 17:55:29 UTC 2022
<snip>
>
> On 2022-05-19 16:42, Harry Wentland wrote:
>>
>>
>> On 2022-05-13 16:22, Sung Joon Kim wrote:
>>> Issue fixed: Overlay plane alpha channel blending is incorrect
>>>
>>> Issue tracker: https://gitlab.freedesktop.org/drm/amd/-/issues/1769
>>>
>>> According to the KMS man page, there is a "Coverage" alpha blend mode
>>> that assumes the pixel color values have NOT been pre-multiplied and
>>> will be done when the actual blending to the background color values
>>> happens.
>>>
>>> Previously, this mode hasn't been enabled in our driver and it was
>>> assumed that all normal overlay planes are pre-multiplied by default.
>>>
>>> When a 3rd party app is used to input a image in a specific format,
>>> e.g. PNG, as a source of a overlay plane to blend with the background
>>> primary plane, the pixel color values are not pre-multiplied. So by
>>> adding "Coverage" blend mode, our driver will support those cases.
>>>
>>> Reference:
>>> https://dri.freedesktop.org/docs/drm/gpu/drm-kms.html#plane-compositi
>>> on-properties
>>>
>>> Adding Coverage support also enables IGT kms_plane_alpha_blend
>>> Coverage subtests:
>>> 1. coverage-7efc
>>> 2. coverage-vs-premult-vs-constant
>>>
>>> Signed-off-by: Sung Joon Kim <Sungjoon.Kim at amd.com>
Reviewed-by: Harry Wentland <harry.wentland at amd.com>
<snip>
>>> @@ -2564,14 +2573,6 @@ void dcn10_update_mpcc(struct dc *dc, struct pipe_ctx *pipe_ctx)
>>> else
>>> blnd_cfg.global_alpha = 0xff;
>>>
>>> - /* DCN1.0 has output CM before MPC which seems to screw with
>>> - * pre-multiplied alpha.
>>> - */
>>> - blnd_cfg.pre_multiplied_alpha = is_rgb_cspace(
>>> - pipe_ctx->stream->output_color_space)
>>> - && per_pixel_alpha;
>>> -
>>
>> Could this break color management use-cases on DCN1.x for Windows?
>> Dmytro Laktyushkin added this code 5 years ago. Maybe check with him.
>>
>> Overall I like this patch but let's see if we can confirm that this
>> won't break DCN1.x on Windows.
>>
>> See commit ad32734699da4dd185405637459bf915a4f4cff6.
>>
>> Harry
>
> I spoke with Dmytro and he is okay with the change
>
Thanks for checking.
Harry
> Joon
>>
>>> -
>>> /*
>>> * TODO: remove hack
>>> * Note: currently there is a bug in init_hw such that diff --git
>>> a/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_hwseq.c
>>> b/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_hwseq.c
>>> index e1f87bd72e4a..c117830b8b9d 100644
>>> --- a/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_hwseq.c
>>> +++ b/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_hwseq.c
>>> @@ -2346,12 +2346,16 @@ void dcn20_update_mpcc(struct dc *dc, struct pipe_ctx *pipe_ctx)
>>> blnd_cfg.overlap_only = false;
>>> blnd_cfg.global_gain = 0xff;
>>>
>>> - if (per_pixel_alpha && pipe_ctx->plane_state->global_alpha) {
>>> - blnd_cfg.alpha_mode = MPCC_ALPHA_BLEND_MODE_PER_PIXEL_ALPHA_COMBINED_GLOBAL_GAIN;
>>> - blnd_cfg.global_gain = pipe_ctx->plane_state->global_alpha_value;
>>> - } else if (per_pixel_alpha) {
>>> - blnd_cfg.alpha_mode = MPCC_ALPHA_BLEND_MODE_PER_PIXEL_ALPHA;
>>> + if (per_pixel_alpha) {
>>> + blnd_cfg.pre_multiplied_alpha = pipe_ctx->plane_state->pre_multiplied_alpha;
>>> + if (pipe_ctx->plane_state->global_alpha) {
>>> + blnd_cfg.alpha_mode = MPCC_ALPHA_BLEND_MODE_PER_PIXEL_ALPHA_COMBINED_GLOBAL_GAIN;
>>> + blnd_cfg.global_gain = pipe_ctx->plane_state->global_alpha_value;
>>> + } else {
>>> + blnd_cfg.alpha_mode = MPCC_ALPHA_BLEND_MODE_PER_PIXEL_ALPHA;
>>> + }
>>> } else {
>>> + blnd_cfg.pre_multiplied_alpha = false;
>>> blnd_cfg.alpha_mode = MPCC_ALPHA_BLEND_MODE_GLOBAL_ALPHA;
>>> }
>>>
>>> @@ -2365,7 +2369,7 @@ void dcn20_update_mpcc(struct dc *dc, struct pipe_ctx *pipe_ctx)
>>> blnd_cfg.top_gain = 0x1f000;
>>> blnd_cfg.bottom_inside_gain = 0x1f000;
>>> blnd_cfg.bottom_outside_gain = 0x1f000;
>>> - blnd_cfg.pre_multiplied_alpha = per_pixel_alpha;
>>> +
>>> if (pipe_ctx->plane_state->format
>>> == SURFACE_PIXEL_FORMAT_GRPH_RGBE_ALPHA)
>>> blnd_cfg.pre_multiplied_alpha = false;
>>
>
More information about the amd-gfx
mailing list