From: "Leo (Sunpeng) Li" <sunpeng...@amd.com>

We compose the two LUTs when pushing non-legacy gamma changes, and the
same needs to be done when setting legacy gamma.

To do so, we just call push_cm_prop() on the gamma LUT. It will compose
the LUTs for us, and fall back to using legacy LUT (upscaled to non-
legacy size) if non-legacy is unavailable.

It's also possible that the Kernel has no support support for non-
legacy color. In which case, we fall back to legacy gamma.

v2: Remove per-CRTC check for color management support.

Signed-off-by: Leo (Sunpeng) Li <sunpeng...@amd.com>
---
 src/drmmode_display.c | 16 ++++++++++++++--
 1 file changed, 14 insertions(+), 2 deletions(-)

diff --git a/src/drmmode_display.c b/src/drmmode_display.c
index 8f3f3bc..17b5dbc 100644
--- a/src/drmmode_display.c
+++ b/src/drmmode_display.c
@@ -1245,9 +1245,21 @@ drmmode_crtc_gamma_do_set(xf86CrtcPtr crtc, uint16_t 
*red, uint16_t *green,
 {
        drmmode_crtc_private_ptr drmmode_crtc = crtc->driver_private;
        AMDGPUEntPtr pAMDGPUEnt = AMDGPUEntPriv(crtc->scrn);
+       int ret;
+
+       /* Use legacy if no support for non-legacy gamma */
+       if (!drmmode_cm_enabled(drmmode_crtc->drmmode)) {
+               drmModeCrtcSetGamma(pAMDGPUEnt->fd,
+                                   drmmode_crtc->mode_crtc->crtc_id,
+                                   size, red, green, blue);
+               return;
+       }
 
-       drmModeCrtcSetGamma(pAMDGPUEnt->fd, drmmode_crtc->mode_crtc->crtc_id,
-                           size, red, green, blue);
+       ret = drmmode_crtc_push_cm_prop(crtc, CM_GAMMA_LUT);
+       if (ret)
+               xf86DrvMsg(crtc->scrn->scrnIndex, X_ERROR,
+                          "Setting Gamma LUT failed with errno %d\n",
+                          ret);
 }
 
 Bool
-- 
2.7.4

_______________________________________________
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx

Reply via email to