[PATCH 4/4] drm/omapdrm: Implement gamma_lut atomic crtc property
Daniel Vetter
daniel at ffwll.ch
Fri May 20 07:05:18 UTC 2016
On Fri, May 20, 2016 at 09:35:56AM +0300, Jyri Sarha wrote:
> Implement gamma_lut atomic crtc property, set crtc gamma size to 256
> for all crtcs and use drm_atomic_helper_legacy_gamma_set() as
> gamma_set func. The tv-out crtc has 1024 element gamma table (with
> 10bit precision) in HW, but current Xorg server does not accept
> anything else but 256 elements so that is used for all CRTCs. The dss
> dispc API converts table of any length for HW and uses linear
> interpolation in the process.
>
> Signed-off-by: Jyri Sarha <jsarha at ti.com>
I think you also want to wire up drm_atomic_helper_legacy_gamma_set so
that legacy clients using the gamma ioctl will work with this support.
-Daniel
> ---
> drivers/gpu/drm/omapdrm/omap_crtc.c | 20 ++++++++++++++++++++
> 1 file changed, 20 insertions(+)
>
> diff --git a/drivers/gpu/drm/omapdrm/omap_crtc.c b/drivers/gpu/drm/omapdrm/omap_crtc.c
> index 075f2bb..d5210fe 100644
> --- a/drivers/gpu/drm/omapdrm/omap_crtc.c
> +++ b/drivers/gpu/drm/omapdrm/omap_crtc.c
> @@ -384,6 +384,15 @@ static void omap_crtc_atomic_flush(struct drm_crtc *crtc,
>
> WARN_ON(omap_crtc->vblank_irq.registered);
>
> + if (crtc->state->color_mgmt_changed) {
> + struct drm_color_lut *lut = (struct drm_color_lut *)
> + crtc->state->gamma_lut->data;
> + unsigned int length = crtc->state->gamma_lut->length /
> + sizeof(*lut);
> +
> + dispc_mgr_set_gamma(omap_crtc->channel, lut, length);
> + }
> +
> if (dispc_mgr_is_enabled(omap_crtc->channel)) {
>
> DBG("%s: GO", omap_crtc->name);
> @@ -460,6 +469,7 @@ static const struct drm_crtc_funcs omap_crtc_funcs = {
> .set_config = drm_atomic_helper_set_config,
> .destroy = omap_crtc_destroy,
> .page_flip = drm_atomic_helper_page_flip,
> + .gamma_set = drm_atomic_helper_legacy_gamma_set,
> .set_property = drm_atomic_helper_crtc_set_property,
> .atomic_duplicate_state = drm_atomic_helper_crtc_duplicate_state,
> .atomic_destroy_state = drm_atomic_helper_crtc_destroy_state,
> @@ -534,6 +544,16 @@ struct drm_crtc *omap_crtc_init(struct drm_device *dev,
>
> drm_crtc_helper_add(crtc, &omap_crtc_helper_funcs);
>
> + /* The dispc API adapts to what ever size, but the HW supports
> + * 256 element gamma table for LCDs and 1024 element table for
> + * OMAP_DSS_CHANNEL_DIGIT. X server assumes 256 element gamma
> + * tables so lets use that. Size of HW gamma table can be
> + * extracted with dispc_mgr_gamma_size(). If it returns 0
> + * gamma table is not supprted.
> + */
> + if (dispc_mgr_gamma_size(channel))
> + drm_mode_crtc_set_gamma_size(crtc, 256);
> +
> omap_plane_install_properties(crtc->primary, &crtc->base);
>
> omap_crtcs[channel] = omap_crtc;
> --
> 1.9.1
>
--
Daniel Vetter
Software Engineer, Intel Corporation
http://blog.ffwll.ch
More information about the dri-devel
mailing list