Hi, On 24/05/16 12:16, 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@xxxxxx> > --- > 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; > I think you also need to attach the GAMMA_LUT and GAMMA_LUT_SIZE properties to the crtc. Otherwise only the legacy API is available. See drm_helper_crtc_enable_color_mgmt() (we can't use that, but as an example). Tomi
Attachment:
signature.asc
Description: OpenPGP digital signature
_______________________________________________ dri-devel mailing list dri-devel@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/dri-devel