From e21d31e8ab047966a3d6c6ee489e5cfe93819781 Mon Sep 17 00:00:00 2001 From: Jakob Bornecrantz Date: Wed, 25 Mar 2009 20:51:47 +0000 Subject: [PATCH] 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(+) diff --git a/src/gallium/state_trackers/egl/egl_surface.c b/src/gallium/state_trackers/egl/egl_surface.c index e6e80b985aa..ca545b12e68 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 9667c7ee3d4..abdf84544f3 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 908bab5f9bf..ce2717de639 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; -- 2.30.2