From: Pekka Paalanen Date: Tue, 12 Sep 2017 13:02:01 +0000 (+0300) Subject: compositor-drm: drm_output_apply_state_legacy heads X-Git-Tag: upstream/5.0.0~153 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=02aeb5c66ed7a6ff7f5603268d65d36398de27dd;p=platform%2Fupstream%2Fweston.git compositor-drm: drm_output_apply_state_legacy heads Fix this function to support more than one head per output. v9: - Change { connectors, 0 } to { NULL, 0 } in drmModeSetCrtc() args. Signed-off-by: Pekka Paalanen Reviewed-by: Daniel Stone Acked-by: Derek Foreman --- diff --git a/libweston/compositor-drm.c b/libweston/compositor-drm.c index e3eb0e5..b9898e4 100644 --- a/libweston/compositor-drm.c +++ b/libweston/compositor-drm.c @@ -1797,18 +1797,24 @@ static int drm_output_apply_state_legacy(struct drm_output_state *state) { struct drm_output *output = state->output; - struct drm_head *head = to_drm_head(weston_output_get_first_head(&output->base)); struct drm_backend *backend = to_drm_backend(output->base.compositor); struct drm_plane *scanout_plane = output->scanout_plane; - struct drm_property_info *dpms_prop = - &head->props_conn[WDRM_CONNECTOR_DPMS]; + struct drm_property_info *dpms_prop; struct drm_plane_state *scanout_state; struct drm_plane_state *ps; struct drm_plane *p; struct drm_mode *mode; + struct drm_head *head; + uint32_t connectors[MAX_CLONED_CONNECTORS]; + int n_conn = 0; struct timespec now; int ret = 0; + wl_list_for_each(head, &output->base.head_list, base.output_link) { + assert(n_conn < MAX_CLONED_CONNECTORS); + connectors[n_conn++] = head->connector_id; + } + /* If disable_planes is set then assign_planes() wasn't * called for this render, so we could still have a stale * cursor plane set up. @@ -1844,7 +1850,7 @@ drm_output_apply_state_legacy(struct drm_output_state *state) } ret = drmModeSetCrtc(backend->drm.fd, output->crtc_id, 0, 0, 0, - &head->connector_id, 0, NULL); + NULL, 0, NULL); if (ret) weston_log("drmModeSetCrtc failed disabling: %m\n"); @@ -1879,7 +1885,7 @@ drm_output_apply_state_legacy(struct drm_output_state *state) ret = drmModeSetCrtc(backend->drm.fd, output->crtc_id, scanout_state->fb->fb_id, 0, 0, - &head->connector_id, 1, + connectors, n_conn, &mode->mode_info); if (ret) { weston_log("set mode failed: %m\n"); @@ -1950,14 +1956,20 @@ drm_output_apply_state_legacy(struct drm_output_state *state) } } - if (dpms_prop->prop_id && state->dpms != output->state_cur->dpms) { - ret = drmModeConnectorSetProperty(backend->drm.fd, - head->connector_id, - dpms_prop->prop_id, - state->dpms); - if (ret) { - weston_log("DRM: DPMS: failed property set for %s\n", - output->base.name); + if (state->dpms != output->state_cur->dpms) { + wl_list_for_each(head, &output->base.head_list, base.output_link) { + dpms_prop = &head->props_conn[WDRM_CONNECTOR_DPMS]; + if (dpms_prop->prop_id == 0) + continue; + + ret = drmModeConnectorSetProperty(backend->drm.fd, + head->connector_id, + dpms_prop->prop_id, + state->dpms); + if (ret) { + weston_log("DRM: DPMS: failed property set for %s\n", + head->base.name); + } } }