Mesa (master): st/egl: Set dpms to on when showing screens

Jakob Bornecrantz wallbraker at kemper.freedesktop.org
Wed Mar 25 14:09:25 PDT 2009


Module: Mesa
Branch: master
Commit: e21d31e8ab047966a3d6c6ee489e5cfe93819781
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=e21d31e8ab047966a3d6c6ee489e5cfe93819781

Author: Jakob Bornecrantz <wallbraker at gmail.com>
Date:   Wed Mar 25 20:51:47 2009 +0000

st/egl: Set dpms to on when showing screens

	There is a wonderful bug in 2.6.29 that causes a hard lock on my
	computer when this code is active for lvds that are turned off.

---

 src/gallium/state_trackers/egl/egl_surface.c |    7 +++++++
 src/gallium/state_trackers/egl/egl_tracker.c |   21 +++++++++++++++++++++
 src/gallium/state_trackers/egl/egl_tracker.h |    3 +++
 3 files changed, 31 insertions(+), 0 deletions(-)

diff --git a/src/gallium/state_trackers/egl/egl_surface.c b/src/gallium/state_trackers/egl/egl_surface.c
index e6e80b9..ca545b1 100644
--- a/src/gallium/state_trackers/egl/egl_surface.c
+++ b/src/gallium/state_trackers/egl/egl_surface.c
@@ -330,6 +330,13 @@ drm_show_screen_surface_mesa(_EGLDriver *drv, EGLDisplay dpy,
 	if (ret)
 		goto err_crtc;
 
+
+	if (scrn->dpms)
+		drmModeConnectorSetProperty(dev->drmFD,
+		                            scrn->connectorID,
+		                            scrn->dpms->prop_id,
+		                            DRM_MODE_DPMS_ON);
+
 	surf->screen = scrn;
 
 	scrn->surf = surf;
diff --git a/src/gallium/state_trackers/egl/egl_tracker.c b/src/gallium/state_trackers/egl/egl_tracker.c
index 9667c7e..abdf845 100644
--- a/src/gallium/state_trackers/egl/egl_tracker.c
+++ b/src/gallium/state_trackers/egl/egl_tracker.c
@@ -107,6 +107,25 @@ drm_add_modes_from_connector(_EGLScreen *screen, drmModeConnectorPtr connector)
 	}
 }
 
+static void
+drm_find_dpms(struct drm_device *dev, struct drm_screen *screen)
+{
+	drmModeConnectorPtr c = screen->connector;
+	drmModePropertyPtr p;
+	int i;
+
+	for (i = 0; i < c->count_props; i++) {
+		p = drmModeGetProperty(dev->drmFD, c->props[i]);
+		if (!strcmp(p->name, "DPMS"))
+			break;
+
+		drmModeFreeProperty(p);
+		p = NULL;
+	}
+
+	screen->dpms = p;
+}
+
 EGLBoolean
 drm_initialize(_EGLDriver *drv, EGLDisplay dpy, EGLint *major, EGLint *minor)
 {
@@ -160,6 +179,7 @@ drm_initialize(_EGLDriver *drv, EGLDisplay dpy, EGLint *major, EGLint *minor)
 		_eglInitScreen(&screen->base);
 		_eglAddScreen(disp, &screen->base);
 		drm_add_modes_from_connector(&screen->base, connector);
+		drm_find_dpms(dev, screen);
 		dev->screens[num_screens++] = screen;
 	}
 	dev->count_screens = num_screens;
@@ -206,6 +226,7 @@ drm_terminate(_EGLDriver *drv, EGLDisplay dpy)
 		if (screen->shown)
 			drm_takedown_shown_screen(drv, screen);
 
+		drmModeFreeProperty(screen->dpms);
 		drmModeFreeConnector(screen->connector);
 		_eglDestroyScreen(&screen->base);
 		dev->screens[i] = NULL;
diff --git a/src/gallium/state_trackers/egl/egl_tracker.h b/src/gallium/state_trackers/egl/egl_tracker.h
index 908bab5..ce2717d 100644
--- a/src/gallium/state_trackers/egl/egl_tracker.h
+++ b/src/gallium/state_trackers/egl/egl_tracker.h
@@ -114,6 +114,9 @@ struct drm_screen
 	drmModeConnectorPtr connector;
 	uint32_t connectorID;
 
+	/* dpms property */
+	drmModePropertyPtr dpms;
+
 	/* Has this screen been shown */
 	int shown;
 



More information about the mesa-commit mailing list