gl/gbm: Improve logging output
authorCarlos Rafael Giani <dv@pseudoterminal.org>
Wed, 3 Oct 2018 22:22:02 +0000 (00:22 +0200)
committerNicolas Dufresne <nicolas.dufresne@collabora.com>
Sat, 1 Dec 2018 18:36:17 +0000 (13:36 -0500)
* List all connectors, modes, and encoders, even after picking one
* Add missing DRM_MODE_CONNECTOR_DPI string for logging and improve
  existing strings
* Make sure the names matches modetest/modeprint from DRM utilities

Related to #490

gst-libs/gst/gl/gbm/gstgl_gbm_utils.c
gst-libs/gst/gl/gbm/gstgldisplay_gbm.c

index 2537b42..0f92591 100644 (file)
@@ -26,7 +26,6 @@
 GST_DEBUG_CATEGORY_EXTERN (gst_gl_gbm_debug);
 #define GST_CAT_DEFAULT gst_gl_gbm_debug
 
-
 const gchar *
 gst_gl_gbm_get_name_for_drm_connector (drmModeConnector * connector)
 {
@@ -54,7 +53,7 @@ gst_gl_gbm_get_name_for_drm_connector (drmModeConnector * connector)
     case DRM_MODE_CONNECTOR_9PinDIN:
       return "9-Pin DIN";
     case DRM_MODE_CONNECTOR_DisplayPort:
-      return "DisplayPort";
+      return "DP";
     case DRM_MODE_CONNECTOR_HDMIA:
       return "HDMI-A";
     case DRM_MODE_CONNECTOR_HDMIB:
@@ -67,6 +66,8 @@ gst_gl_gbm_get_name_for_drm_connector (drmModeConnector * connector)
       return "Virtual";
     case DRM_MODE_CONNECTOR_DSI:
       return "DSI";
+    case DRM_MODE_CONNECTOR_DPI:
+      return "DPI";
     default:
       return "<unknown>";
   }
index e842046..29c2c5e 100644 (file)
@@ -160,32 +160,41 @@ gst_gl_display_gbm_setup_drm (GstGLDisplayGBM * display_gbm)
    * finally sent to, and typically connects to some form of display, like an
    * HDMI TV, an LVDS panel etc. */
   {
-    drmModeConnector *connector = NULL;
+    drmModeConnector *connected_connector = NULL;
 
     GST_DEBUG ("Checking %d DRM connector(s)",
         display_gbm->drm_mode_resources->count_connectors);
     for (i = 0; i < display_gbm->drm_mode_resources->count_connectors; ++i) {
-      connector = drmModeGetConnector (display_gbm->drm_fd,
+      drmModeConnector *candidate_connector =
+          drmModeGetConnector (display_gbm->drm_fd,
           display_gbm->drm_mode_resources->connectors[i]);
+      const gchar *candidate_name =
+          gst_gl_gbm_get_name_for_drm_connector (candidate_connector);
       GST_DEBUG ("Found DRM connector #%d \"%s\" with ID %" G_GUINT32_FORMAT, i,
-          gst_gl_gbm_get_name_for_drm_connector (connector),
-          connector->connector_id);
-
-      if (connector->connection == DRM_MODE_CONNECTED) {
-        GST_DEBUG ("DRM connector #%d is connected", i);
-        break;
+          candidate_name, candidate_connector->connector_id);
+
+      /* If we already picked a connector, and connected_connector is therefore
+       * non-NULL, then are just printing information about the other connectors
+       * for logging purposes by now, so don't actually do anything with this
+       * connector. Just loop instead. */
+      if (connected_connector != NULL) {
+        drmModeFreeConnector (candidate_connector);
+        continue;
       }
 
-      drmModeFreeConnector (connector);
-      connector = NULL;
+      if (candidate_connector->connection == DRM_MODE_CONNECTED) {
+        GST_DEBUG ("Picking DRM connector #%d because it is connected", i);
+        connected_connector = candidate_connector;
+      } else
+        drmModeFreeConnector (candidate_connector);
     }
 
-    if (connector == NULL) {
+    if (connected_connector == NULL) {
       GST_ERROR ("No connected DRM connector found");
       goto cleanup;
     }
 
-    display_gbm->drm_mode_connector = connector;
+    display_gbm->drm_mode_connector = connected_connector;
   }
 
   /* Check out what modes are supported by the chosen connector,
@@ -194,6 +203,7 @@ gst_gl_display_gbm_setup_drm (GstGLDisplayGBM * display_gbm)
   {
     int selected_mode_index = -1;
     int selected_mode_area = -1;
+    gboolean preferred_mode_found = FALSE;
 
     GST_DEBUG ("Checking %d DRM mode(s) from selected connector",
         display_gbm->drm_mode_connector->count_modes);
@@ -215,14 +225,15 @@ gst_gl_display_gbm_setup_drm (GstGLDisplayGBM * display_gbm)
           current_mode->vscan, current_mode->vrefresh,
           (current_mode->type & DRM_MODE_TYPE_PREFERRED) ? TRUE : FALSE);
 
-      if ((current_mode->type & DRM_MODE_TYPE_PREFERRED) ||
-          (current_mode_area > selected_mode_area)) {
+      if (!preferred_mode_found
+          && ((current_mode->type & DRM_MODE_TYPE_PREFERRED)
+              || (current_mode_area > selected_mode_area))) {
         display_gbm->drm_mode_info = current_mode;
         selected_mode_area = current_mode_area;
         selected_mode_index = i;
 
         if (current_mode->type & DRM_MODE_TYPE_PREFERRED)
-          break;
+          preferred_mode_found = TRUE;
       }
     }
 
@@ -231,7 +242,8 @@ gst_gl_display_gbm_setup_drm (GstGLDisplayGBM * display_gbm)
       goto cleanup;
     }
 
-    GST_DEBUG ("Selected DRM mode #%d", selected_mode_index);
+    GST_DEBUG ("Selected DRM mode #%d (is preferred: %d)", selected_mode_index,
+        preferred_mode_found);
   }
 
   /* Find an encoder that is attached to the chosen connector. Also find the
@@ -245,34 +257,36 @@ gst_gl_display_gbm_setup_drm (GstGLDisplayGBM * display_gbm)
    * used by the DRM to refer to the CRTC universally. (We need the CRTC
    * information for page flipping and DRM scanout framebuffer configuration.) */
   {
-    drmModeEncoder *encoder = NULL;
+    drmModeEncoder *selected_encoder = NULL;
 
     GST_DEBUG ("Checking %d DRM encoder(s)",
         display_gbm->drm_mode_resources->count_encoders);
     for (i = 0; i < display_gbm->drm_mode_resources->count_encoders; ++i) {
-      encoder = drmModeGetEncoder (display_gbm->drm_fd,
+      drmModeEncoder *candidate_encoder =
+          drmModeGetEncoder (display_gbm->drm_fd,
           display_gbm->drm_mode_resources->encoders[i]);
 
       GST_DEBUG ("Found DRM encoder #%d \"%s\"", i,
-          gst_gl_gbm_get_name_for_drm_encoder (encoder));
+          gst_gl_gbm_get_name_for_drm_encoder (candidate_encoder));
 
-      if (encoder->encoder_id == display_gbm->drm_mode_connector->encoder_id) {
+      if ((selected_encoder == NULL) &&
+          (candidate_encoder->encoder_id ==
+              display_gbm->drm_mode_connector->encoder_id)) {
+        selected_encoder = candidate_encoder;
         GST_DEBUG ("DRM encoder #%d corresponds to selected DRM connector "
             "-> selected", i);
-        break;
-      }
-      drmModeFreeEncoder (encoder);
-      encoder = NULL;
+      } else
+        drmModeFreeEncoder (candidate_encoder);
     }
 
-    if (encoder == NULL) {
+    if (selected_encoder == NULL) {
       GST_DEBUG ("No encoder found; searching for CRTC ID in the connector");
       display_gbm->crtc_id =
           gst_gl_gbm_find_crtc_id_for_connector (display_gbm);
     } else {
       GST_DEBUG ("Using CRTC ID from selected encoder");
-      display_gbm->crtc_id = encoder->crtc_id;
-      drmModeFreeEncoder (encoder);
+      display_gbm->crtc_id = selected_encoder->crtc_id;
+      drmModeFreeEncoder (selected_encoder);
     }
 
     if (display_gbm->crtc_id == INVALID_CRTC) {