[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