[PATCH 1/2] compositor-drm: Cache the DPMS property on drm_output

Ander Conselvan de Oliveira conselvan2 at gmail.com
Tue Jun 4 06:24:04 PDT 2013


From: Ander Conselvan de Oliveira <ander.conselvan.de.oliveira at intel.com>

This avoids one drmModeGetConnector() call every time the DPMS mode is
set. That call can take hundreds of milliseconds due to DDC.
---
 src/compositor-drm.c |   21 +++++++--------------
 1 file changed, 7 insertions(+), 14 deletions(-)

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. */
-- 
1.7.9.5



More information about the wayland-devel mailing list