[PATCH xf86-video-ati] Apply gamma correction to HW cursor
Deucher, Alexander
Alexander.Deucher at amd.com
Wed May 10 16:04:46 UTC 2017
> -----Original Message-----
> From: amd-gfx [mailto:amd-gfx-bounces at lists.freedesktop.org] On Behalf
> Of Michel Dänzer
> Sent: Wednesday, May 10, 2017 4:25 AM
> To: amd-gfx at lists.freedesktop.org
> Subject: [PATCH xf86-video-ati] Apply gamma correction to HW cursor
>
> From: Michel Dänzer <michel.daenzer at amd.com>
>
> The display hardware CLUT we're currently using for gamma correction
> doesn't affect the HW cursor, so we have to apply it manually when
> uploading the HW cursor data.
>
> This currently only works in depth 24/32.
>
> (Ported from amdgpu commit 82fa615f38137add75f9cd4bb49c48dd88de916f)
>
> Signed-off-by: Michel Dänzer <michel.daenzer at amd.com>
Reviewed-by: Alex Deucher <alexander.deucher at amd.com>
> ---
> src/drmmode_display.c | 66
> ++++++++++++++++++++++++++++++++++++++++++++-------
> 1 file changed, 58 insertions(+), 8 deletions(-)
>
> diff --git a/src/drmmode_display.c b/src/drmmode_display.c
> index 84e7ef967..0b823754b 100644
> --- a/src/drmmode_display.c
> +++ b/src/drmmode_display.c
> @@ -812,6 +812,17 @@ drmmode_crtc_scanout_update(xf86CrtcPtr crtc,
> DisplayModePtr mode,
> }
> }
>
> +static void
> +drmmode_crtc_gamma_do_set(xf86CrtcPtr crtc, uint16_t *red, uint16_t
> *green,
> + uint16_t *blue, int size)
> +{
> + drmmode_crtc_private_ptr drmmode_crtc = crtc->driver_private;
> +
> + drmModeCrtcSetGamma(drmmode_crtc->drmmode->fd,
> + drmmode_crtc->mode_crtc->crtc_id, size, red,
> green,
> + blue);
> +}
> +
> static Bool
> drmmode_set_mode_major(xf86CrtcPtr crtc, DisplayModePtr mode,
> Rotation rotation, int x, int y)
> @@ -873,8 +884,8 @@ drmmode_set_mode_major(xf86CrtcPtr crtc,
> DisplayModePtr mode,
> if (drmmode_crtc->tear_free)
> scanout_id = drmmode_crtc->scanout_id;
>
> - crtc->funcs->gamma_set(crtc, crtc->gamma_red, crtc-
> >gamma_green,
> - crtc->gamma_blue, crtc->gamma_size);
> + drmmode_crtc_gamma_do_set(crtc, crtc->gamma_red, crtc-
> >gamma_green,
> + crtc->gamma_blue, crtc-
> >gamma_size);
>
> drmmode_ConvertToKMode(crtc->scrn, &kmode, mode);
>
> @@ -1043,6 +1054,31 @@ drmmode_cursor_src_offset(Rotation rotation,
> int width, int height,
>
> #endif
>
> +static uint32_t
> +drmmode_cursor_gamma(xf86CrtcPtr crtc, uint32_t argb)
> +{
> + uint32_t alpha = argb >> 24;
> + uint32_t rgb[3];
> + int i;
> +
> + 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;
> +
> + /* Apply gamma correction and pre-multiply alpha */
> + rgb[0] = (crtc->gamma_blue[rgb[0]] >> 8) * alpha / 0xff;
> + rgb[1] = (crtc->gamma_green[rgb[1]] >> 8) * alpha / 0xff;
> + rgb[2] = (crtc->gamma_red[rgb[2]] >> 8) * alpha / 0xff;
> +
> + return alpha << 24 | rgb[2] << 16 | rgb[1] << 8 | rgb[0];
> +}
> +
> static void
> drmmode_load_cursor_argb (xf86CrtcPtr crtc, CARD32 *image)
> {
> @@ -1068,7 +1104,8 @@ drmmode_load_cursor_argb (xf86CrtcPtr crtc,
> CARD32 *image)
> dstx, dsty);
>
> ptr[dsty * info->cursor_w + dstx] =
> - cpu_to_le32(image[srcoffset]);
> +
> cpu_to_le32(drmmode_cursor_gamma(crtc,
> +
> image[srcoffset]));
> }
> }
> } else
> @@ -1078,7 +1115,7 @@ drmmode_load_cursor_argb (xf86CrtcPtr crtc,
> CARD32 *image)
> int i;
>
> for (i = 0; i < cursor_size; i++)
> - ptr[i] = cpu_to_le32(image[i]);
> + ptr[i] = cpu_to_le32(drmmode_cursor_gamma(crtc,
> image[i]));
> }
> }
>
> @@ -1209,11 +1246,24 @@ static void
> drmmode_crtc_gamma_set(xf86CrtcPtr crtc, uint16_t *red, uint16_t
> *green,
> uint16_t *blue, int size)
> {
> - drmmode_crtc_private_ptr drmmode_crtc = crtc->driver_private;
> - drmmode_ptr drmmode = drmmode_crtc->drmmode;
> + ScrnInfoPtr scrn = crtc->scrn;
> + xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(scrn);
> + RADEONInfoPtr info = RADEONPTR(scrn);
> + int i;
>
> - drmModeCrtcSetGamma(drmmode->fd, drmmode_crtc-
> >mode_crtc->crtc_id,
> - size, red, green, blue);
> + drmmode_crtc_gamma_do_set(crtc, red, green, blue, size);
> +
> + /* Compute index of this CRTC into xf86_config->crtc */
> + for (i = 0; xf86_config->crtc[i] != crtc; i++) {}
> +
> + if (info->hwcursor_disabled & (1 << i))
> + return;
> +
> +#ifdef HAVE_XF86_CURSOR_RESET_CURSOR
> + xf86CursorResetCursor(scrn->pScreen);
> +#else
> + xf86_reload_cursors(scrn->pScreen);
> +#endif
> }
>
> #ifdef RADEON_PIXMAP_SHARING
> --
> 2.11.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