From: Harsha M M <[email protected]> drmModeCrtcSetGamma is a legacy now. Use the generic drm property to set Gamma. If GAMMA_LUT is not supported then legacy api will be used.
Signed-off-by: Harsha M M <[email protected]> --- libweston/compositor-drm.c | 83 ++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 77 insertions(+), 6 deletions(-) diff --git a/libweston/compositor-drm.c b/libweston/compositor-drm.c index 8b1ea66..27c95da 100644 --- a/libweston/compositor-drm.c +++ b/libweston/compositor-drm.c @@ -196,12 +196,16 @@ static const struct drm_property_info connector_props[] = { enum wdrm_crtc_property { WDRM_CRTC_MODE_ID = 0, WDRM_CRTC_ACTIVE, + WDRM_CRTC_GAMMA_LUT, + WDRM_CRTC_GAMMA_LUT_SIZE, WDRM_CRTC__COUNT }; static const struct drm_property_info crtc_props[] = { [WDRM_CRTC_MODE_ID] = { .name = "MODE_ID", }, [WDRM_CRTC_ACTIVE] = { .name = "ACTIVE", }, + [WDRM_CRTC_GAMMA_LUT] = { .name = "GAMMA_LUT", }, + [WDRM_CRTC_GAMMA_LUT_SIZE] = { .name = "GAMMA_LUT_SIZE", }, }; /** @@ -1752,16 +1756,63 @@ drm_output_set_gamma(struct weston_output *output_base, struct drm_output *output = to_drm_output(output_base); struct drm_backend *backend = to_drm_backend(output->base.compositor); + uint32_t gamma_prop_id; + uint32_t gamma_size_prop_id; + struct drm_color_lut *lut = NULL; + uint32_t gamma_blobid = 0; + uint32_t loop; + /* check */ if (output_base->gamma_size != size) return; - rc = drmModeCrtcSetGamma(backend->drm.fd, - output->crtc_id, - size, r, g, b); - if (rc) - weston_log("set gamma failed: %m\n"); + gamma_prop_id = output->props_crtc[WDRM_CRTC_GAMMA_LUT].prop_id; + gamma_size_prop_id = output->props_crtc[WDRM_CRTC_GAMMA_LUT_SIZE]. + prop_id; + + if (gamma_prop_id && gamma_size_prop_id) { + lut = malloc(sizeof(struct drm_color_lut) * size); + if (!lut) { + weston_log("failed to allocate memory for gamma lut\n"); + goto out; + } + + for (loop = 0; loop < size; loop++) { + lut[loop].red = r[loop]; + lut[loop].green = g[loop]; + lut[loop].blue = b[loop]; + } + + rc = drmModeCreatePropertyBlob(backend->drm.fd, lut, + sizeof(struct drm_color_lut) * size, &gamma_blobid); + if (rc) { + weston_log("failed to create drm gamma blob: %m\n"); + goto out; + } + + rc = drmModeObjectSetProperty(backend->drm.fd, output->crtc_id, + DRM_MODE_OBJECT_CRTC, gamma_prop_id, gamma_blobid); + + if (rc) + weston_log("set of gamma lut property failed for crtc %d: %m\n", + output->crtc_id); + } else { + rc = drmModeCrtcSetGamma(backend->drm.fd, + output->crtc_id, + size, r, g, b); + if (rc) + weston_log("set gamma failed for crtc %d: %m\n", + output->crtc_id); + + return; + } + out: + if (lut) + free(lut); + if (gamma_blobid) + drmModeDestroyPropertyBlob(backend->drm.fd, gamma_blobid); + } /* Determine the type of vblank synchronization to use for the output. @@ -4758,15 +4809,35 @@ drm_output_init_gamma_size(struct drm_output *output) { struct drm_backend *backend = to_drm_backend(output->base.compositor); drmModeCrtc *crtc; + uint32_t gamma_prop_id; + uint32_t gamma_size_prop_id; + struct drm_property_info *props_crtc; + drmModeObjectProperties *props; assert(output->base.compositor); assert(output->crtc_id != 0); + crtc = drmModeGetCrtc(backend->drm.fd, output->crtc_id); if (!crtc) return -1; output->base.gamma_size = crtc->gamma_size; - + props_crtc = &output->props_crtc[0]; + gamma_prop_id = props_crtc[WDRM_CRTC_GAMMA_LUT].prop_id; + gamma_size_prop_id = props_crtc[WDRM_CRTC_GAMMA_LUT_SIZE].prop_id; + + if (gamma_prop_id && gamma_size_prop_id) { + props = drmModeObjectGetProperties(backend->drm.fd, + output->crtc_id, + DRM_MODE_OBJECT_CRTC); + if (props) { + output->base.gamma_size = drm_property_get_value( + &props_crtc[WDRM_CRTC_GAMMA_LUT_SIZE], + props, + WDRM_CRTC__COUNT); + } + } + drmModeFreeCrtc(crtc); return 0; -- 2.7.4 _______________________________________________ wayland-devel mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/wayland-devel
