From: Ander Conselvan de Oliveira Date: Tue, 4 Jun 2013 13:24:04 +0000 (+0300) Subject: compositor-drm: Cache the DPMS property on drm_output X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=a0a433a223be3e3b526485475cf43b4f9e9ca548;p=profile%2Fivi%2Fweston-ivi-shell.git compositor-drm: Cache the DPMS property on drm_output This avoids one drmModeGetConnector() call every time the DPMS mode is set. That call can take hundreds of milliseconds due to DDC. --- diff --git a/src/compositor-drm.c b/src/compositor-drm.c index 4222e57..27d4d02 100644 --- a/src/compositor-drm.c +++ b/src/compositor-drm.c @@ -145,6 +145,7 @@ struct drm_output { uint32_t connector_id; drmModeCrtcPtr original_crtc; struct drm_edid edid; + drmModePropertyPtr dpms_prop; int vblank_pending; int page_flip_pending; @@ -1054,6 +1055,8 @@ drm_output_destroy(struct weston_output *output_base) if (output->backlight) backlight_destroy(output->backlight); + drmModeFreeProperty(output->dpms_prop); + /* Turn off hardware cursor */ drmModeSetCursor(c->drm.fd, output->crtc_id, 0, 0, 0); @@ -1365,23 +1368,12 @@ drm_set_dpms(struct weston_output *output_base, enum dpms_enum level) struct drm_output *output = (struct drm_output *) output_base; struct weston_compositor *ec = output_base->compositor; struct drm_compositor *c = (struct drm_compositor *) ec; - drmModeConnectorPtr connector; - drmModePropertyPtr prop; - connector = drmModeGetConnector(c->drm.fd, output->connector_id); - if (!connector) + if (!output->dpms_prop) return; - prop = drm_get_prop(c->drm.fd, connector, "DPMS"); - if (!prop) { - drmModeFreeConnector(connector); - return; - } - - drmModeConnectorSetProperty(c->drm.fd, connector->connector_id, - prop->prop_id, level); - drmModeFreeProperty(prop); - drmModeFreeConnector(connector); + drmModeConnectorSetProperty(c->drm.fd, output->connector_id, + output->dpms_prop->prop_id, level); } static const char *connector_type_names[] = { @@ -1813,6 +1805,7 @@ create_output_for_connector(struct drm_compositor *ec, ec->connector_allocator |= (1 << output->connector_id); output->original_crtc = drmModeGetCrtc(ec->drm.fd, output->crtc_id); + output->dpms_prop = drm_get_prop(ec->drm.fd, connector, "DPMS"); /* Get the current mode on the crtc that's currently driving * this connector. */