[PATCH v2 xf86-video-amdgpu] Don't apply gamma to HW cursor data if colour management is enabled

Alex Deucher alexdeucher at gmail.com
Wed Jun 27 18:40:36 UTC 2018


On Wed, Jun 27, 2018 at 12:20 PM, Michel Dänzer <michel at daenzer.net> wrote:
> From: Michel Dänzer <michel.daenzer at amd.com>
>
> In that case (with DC as of 4.17 kernels), the display hardware applies
> gamma to the HW cursor.
>
> v2:
> * Also use all 0s when alpha == 0 in the gamma passthrough case.
>
> Bugzilla: https://bugs.freedesktop.org/106578
> Signed-off-by: Michel Dänzer <michel.daenzer at amd.com>

Reviewed-by: Alex Deucher <alexander.deucher at amd.com>

> ---
>  src/drmmode_display.c | 25 +++++++++++++++++++------
>  1 file changed, 19 insertions(+), 6 deletions(-)
>
> diff --git a/src/drmmode_display.c b/src/drmmode_display.c
> index fa0c05b0c..1563417a7 100644
> --- a/src/drmmode_display.c
> +++ b/src/drmmode_display.c
> @@ -1515,6 +1515,17 @@ drmmode_cursor_src_offset(Rotation rotation, int width, int height,
>
>  #endif
>
> +static uint32_t
> +drmmode_cursor_gamma_passthrough(xf86CrtcPtr crtc, uint32_t argb)
> +{
> +       uint32_t alpha = argb >> 24;
> +
> +       if (!alpha)
> +               return 0;
> +
> +       return argb;
> +}
> +
>  static uint32_t
>  drmmode_cursor_gamma(xf86CrtcPtr crtc, uint32_t argb)
>  {
> @@ -1525,9 +1536,6 @@ drmmode_cursor_gamma(xf86CrtcPtr crtc, uint32_t argb)
>         if (!alpha)
>                 return 0;
>
> -       if (crtc->scrn->depth != 24 && crtc->scrn->depth != 32)
> -               return argb;
> -
>         /* Un-premultiply alpha */
>         for (i = 0; i < 3; i++)
>                 rgb[i] = ((argb >> (i * 8)) & 0xff) * 0xff / alpha;
> @@ -1544,6 +1552,12 @@ static void drmmode_do_load_cursor_argb(xf86CrtcPtr crtc, CARD32 *image, uint32_
>  {
>         ScrnInfoPtr pScrn = crtc->scrn;
>         AMDGPUInfoPtr info = AMDGPUPTR(pScrn);
> +       uint32_t (*cursor_gamma)(xf86CrtcPtr crtc, uint32_t argb) =
> +               drmmode_cursor_gamma;
> +
> +       if ((crtc->scrn->depth != 24 && crtc->scrn->depth != 32) ||
> +           drmmode_cm_enabled(&info->drmmode))
> +               cursor_gamma = drmmode_cursor_gamma_passthrough;
>
>  #if XF86_CRTC_VERSION < 7
>         if (crtc->driverIsPerformingTransform) {
> @@ -1559,8 +1573,7 @@ static void drmmode_do_load_cursor_argb(xf86CrtcPtr crtc, CARD32 *image, uint32_
>                                                                       dstx, dsty);
>
>                                 ptr[dsty * info->cursor_w + dstx] =
> -                                       cpu_to_le32(drmmode_cursor_gamma(crtc,
> -                                                                        image[srcoffset]));
> +                                       cpu_to_le32(cursor_gamma(crtc, image[srcoffset]));
>                         }
>                 }
>         } else
> @@ -1570,7 +1583,7 @@ static void drmmode_do_load_cursor_argb(xf86CrtcPtr crtc, CARD32 *image, uint32_
>                 int i;
>
>                 for (i = 0; i < cursor_size; i++)
> -                       ptr[i] = cpu_to_le32(drmmode_cursor_gamma(crtc, image[i]));
> +                       ptr[i] = cpu_to_le32(cursor_gamma(crtc, image[i]));
>         }
>  }
>
> --
> 2.18.0
>
> _______________________________________________
> amd-gfx mailing list
> amd-gfx at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/amd-gfx


More information about the amd-gfx mailing list