Mesa (master): st/xorg: Get new connection status from kernel

Jakob Bornecrantz wallbraker at kemper.freedesktop.org
Wed May 19 21:09:00 UTC 2010


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

Author: Jakob Bornecrantz <jakob at vmware.com>
Date:   Thu Apr 22 10:48:28 2010 +0100

st/xorg: Get new connection status from kernel

---

 src/gallium/state_trackers/xorg/xorg_crtc.c    |    7 +--
 src/gallium/state_trackers/xorg/xorg_output.c  |   59 ++++++++++++++++++++---
 src/gallium/state_trackers/xorg/xorg_tracker.h |    3 +
 3 files changed, 57 insertions(+), 12 deletions(-)

diff --git a/src/gallium/state_trackers/xorg/xorg_crtc.c b/src/gallium/state_trackers/xorg/xorg_crtc.c
index 669bd9e..f9022a9 100644
--- a/src/gallium/state_trackers/xorg/xorg_crtc.c
+++ b/src/gallium/state_trackers/xorg/xorg_crtc.c
@@ -90,11 +90,10 @@ crtc_set_mode_major(xf86CrtcPtr crtc, DisplayModePtr mode,
     xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR(crtc->scrn);
     modesettingPtr ms = modesettingPTR(crtc->scrn);
     xf86OutputPtr output = NULL;
-    drmModeConnectorPtr drm_connector;
     struct crtc_private *crtcp = crtc->driver_private;
     drmModeCrtcPtr drm_crtc = crtcp->drm_crtc;
     drmModeModeInfo drm_mode;
-    int i, ret;
+    int i, ret, connector_id;
 
     for (i = 0; i < config->num_output; output = NULL, i++) {
 	output = config->output[i];
@@ -106,7 +105,7 @@ crtc_set_mode_major(xf86CrtcPtr crtc, DisplayModePtr mode,
     if (!output)
 	return FALSE;
 
-    drm_connector = output->driver_private;
+    connector_id = xorg_output_get_id(output);
 
     drm_mode.clock = mode->Clock;
     drm_mode.hdisplay = mode->HDisplay;
@@ -127,7 +126,7 @@ crtc_set_mode_major(xf86CrtcPtr crtc, DisplayModePtr mode,
     drm_mode.name[DRM_DISPLAY_MODE_LEN - 1] = '\0';
 
     ret = drmModeSetCrtc(ms->fd, drm_crtc->crtc_id, ms->fb_id, x, y,
-			 &drm_connector->connector_id, 1, &drm_mode);
+			 &connector_id, 1, &drm_mode);
 
     if (ret)
 	return FALSE;
diff --git a/src/gallium/state_trackers/xorg/xorg_output.c b/src/gallium/state_trackers/xorg/xorg_output.c
index 13c3fb9..056098f 100644
--- a/src/gallium/state_trackers/xorg/xorg_output.c
+++ b/src/gallium/state_trackers/xorg/xorg_output.c
@@ -51,6 +51,13 @@
 
 #include "xorg_tracker.h"
 
+struct output_private
+{
+    drmModeConnectorPtr drm_connector;
+
+    int c;
+};
+
 static char *output_enum_list[] = {
     "Unknown",
     "VGA",
@@ -82,22 +89,38 @@ output_dpms(xf86OutputPtr output, int mode)
 static xf86OutputStatus
 output_detect(xf86OutputPtr output)
 {
-    drmModeConnectorPtr drm_connector = output->driver_private;
+    modesettingPtr ms = modesettingPTR(output->scrn);
+    struct output_private *priv = output->driver_private;
+    drmModeConnectorPtr drm_connector;
+    xf86OutputStatus status;
+
+    drm_connector = drmModeGetConnector(ms->fd, priv->drm_connector->connector_id);
+    if (drm_connector) {
+	drmModeFreeConnector(priv->drm_connector);
+	priv->drm_connector = drm_connector;
+    } else {
+	drm_connector = priv->drm_connector;
+    }
 
     switch (drm_connector->connection) {
     case DRM_MODE_CONNECTED:
-	return XF86OutputStatusConnected;
+	status = XF86OutputStatusConnected;
+	break;
     case DRM_MODE_DISCONNECTED:
-	return XF86OutputStatusDisconnected;
+	status = XF86OutputStatusDisconnected;
+	break;
     default:
-	return XF86OutputStatusUnknown;
+	status = XF86OutputStatusUnknown;
     }
+
+    return status;
 }
 
 static DisplayModePtr
 output_get_modes(xf86OutputPtr output)
 {
-    drmModeConnectorPtr drm_connector = output->driver_private;
+    struct output_private *priv = output->driver_private;
+    drmModeConnectorPtr drm_connector = priv->drm_connector;
     drmModeModeInfoPtr drm_mode = NULL;
     DisplayModePtr modes = NULL, mode = NULL;
     int i;
@@ -161,7 +184,10 @@ output_get_property(xf86OutputPtr output, Atom property)
 static void
 output_destroy(xf86OutputPtr output)
 {
-    drmModeFreeConnector(output->driver_private);
+    struct output_private *priv = output->driver_private;
+    drmModeFreeConnector(priv->drm_connector);
+    xfree(priv);
+    output->driver_private = NULL;
 }
 
 static const xf86OutputFuncsRec output_funcs = {
@@ -188,6 +214,7 @@ xorg_output_init(ScrnInfoPtr pScrn)
     drmModeResPtr res;
     drmModeConnectorPtr drm_connector = NULL;
     drmModeEncoderPtr drm_encoder = NULL;
+    struct output_private *priv;
     char name[32];
     int c, v, p;
 
@@ -226,9 +253,16 @@ xorg_output_init(ScrnInfoPtr pScrn)
 		 drm_connector->connector_type_id);
 
 
+	priv = xcalloc(sizeof(*priv), 1);
+	if (!priv) {
+	    continue;
+	}
+
 	output = xf86OutputCreate(pScrn, &output_funcs, name);
-	if (!output)
+	if (!output) {
+	    xfree(priv);
 	    continue;
+	}
 
 	drm_encoder = drmModeGetEncoder(ms->fd, drm_connector->encoders[0]);
 	if (drm_encoder) {
@@ -238,7 +272,9 @@ xorg_output_init(ScrnInfoPtr pScrn)
 	    output->possible_crtcs = 0;
 	    output->possible_clones = 0;
 	}
-	output->driver_private = drm_connector;
+	priv->c = c;
+	priv->drm_connector = drm_connector;
+	output->driver_private = priv;
 	output->subpixel_order = SubPixelHorizontalRGB;
 	output->interlaceAllowed = FALSE;
 	output->doubleScanAllowed = FALSE;
@@ -248,4 +284,11 @@ xorg_output_init(ScrnInfoPtr pScrn)
     drmModeFreeResources(res);
 }
 
+unsigned
+xorg_output_get_id(xf86OutputPtr output)
+{
+    struct output_private *priv = output->driver_private;
+    return priv->drm_connector->connector_id;
+}
+
 /* vim: set sw=4 ts=8 sts=4: */
diff --git a/src/gallium/state_trackers/xorg/xorg_tracker.h b/src/gallium/state_trackers/xorg/xorg_tracker.h
index cb67734..8d9c2a0 100644
--- a/src/gallium/state_trackers/xorg/xorg_tracker.h
+++ b/src/gallium/state_trackers/xorg/xorg_tracker.h
@@ -192,6 +192,9 @@ xorg_crtc_cursor_destroy(xf86CrtcPtr crtc);
 void
 xorg_output_init(ScrnInfoPtr pScrn);
 
+unsigned
+xorg_output_get_id(xf86OutputPtr output);
+
 
 /***********************************************************************
  * xorg_xv.c




More information about the mesa-commit mailing list