index 0acb217..3a6f951 100644
--- a/src/backends/x11/meta-monitor-manager-xrandr.c
+++ b/src/backends/x11/meta-monitor-manager-xrandr.c
@@ -807,7 +807,14 @@ meta_monitor_manager_xrandr_read_current (MetaMonitorManager *manager)
       if (output->connection != RR_Disconnected)
 	{
           GBytes *edid;
+	  /* Get this first so that if there are no valid modes we
+	     can immediately skip to the next output without having
+	     to unwind all the assignments below. */
+	  output_get_modes (manager, meta_output, output);
+	  if (meta_output->n_modes == 0)
+	     continue;
 
+	  meta_output->preferred_mode = meta_output->modes[0];
 	  meta_output->winsys_id = resources->outputs[i];
 	  meta_output->name = g_strdup (output->name);
 
@@ -824,8 +831,6 @@ meta_monitor_manager_xrandr_read_current (MetaMonitorManager *manager)
           meta_output->connector_type = output_get_connector_type (manager_xrandr, meta_output);
 
 	  output_get_tile_info (manager_xrandr, meta_output);
-	  output_get_modes (manager, meta_output, output);
-	  meta_output->preferred_mode = meta_output->modes[0];
 
 	  meta_output->n_possible_crtcs = output->ncrtc;
 	  meta_output->possible_crtcs = g_new0 (MetaCRTC *, meta_output->n_possible_crtcs);
