]> git.ipfire.org Git - thirdparty/plymouth.git/commitdiff
[drm] Store mode of each head as index
authorRay Strode <rstrode@redhat.com>
Mon, 14 Jun 2010 02:18:35 +0000 (22:18 -0400)
committerRay Strode <rstrode@redhat.com>
Mon, 14 Jun 2010 02:24:33 +0000 (22:24 -0400)
Previously, we would store the mode of each head as pointer in
the array of modes on the connector object.  Now we just store
the index into that array.

This is to make it clearer that we don't own the memory
associated with it directly, and that the memory associated with
it is automatically cleaned up when the connector is.

This also helps to highlight a problem mentioned by
Forest Bond <forest@alittletooquiet.net> here:

http://lists.freedesktop.org/archives/plymouth/2010-June/000369.html

Namely, we've been naïvely treating the first available mode in
the connector object as the active mode.  While this is true
most of the time, it doesn't hold true if the user overrides the
mode on the kernel command line.

src/plugins/renderers/drm/plugin.c

index 385bd919033cf255ea56cfb4be1b3d8429cbb46f..a7f8af71f0eb72b35ded97eb477b0016813e4fb8 100644 (file)
@@ -72,7 +72,7 @@ struct _ply_renderer_head
   unsigned long row_stride;
 
   drmModeConnector *connector;
-  drmModeModeInfo *mode;
+  int connector_mode_index;
 
   uint32_t controller_id;
   uint32_t encoder_id;
@@ -123,12 +123,13 @@ static bool open_input_source (ply_renderer_backend_t      *backend,
 static ply_renderer_head_t *
 ply_renderer_head_new (ply_renderer_backend_t *backend,
                        drmModeConnector       *connector,
+                       int                     connector_mode_index,
                        uint32_t                encoder_id,
                        uint32_t                controller_id,
-                       uint32_t                console_buffer_id,
-                       drmModeModeInfo        *mode)
+                       uint32_t                console_buffer_id)
 {
   ply_renderer_head_t *head;
+  drmModeModeInfo *mode;
 
   head = calloc (1, sizeof (ply_renderer_head_t));
 
@@ -137,7 +138,10 @@ ply_renderer_head_new (ply_renderer_backend_t *backend,
   head->encoder_id = encoder_id;
   head->controller_id = controller_id;
   head->console_buffer_id = console_buffer_id;
-  head->mode = mode;
+  head->connector_mode_index = connector_mode_index;
+
+  assert (connector_mode_index < connector->count_modes);
+  mode = &head->connector->modes[head->connector_mode_index];
 
   head->area.x = 0;
   head->area.y = 0;
@@ -167,11 +171,15 @@ ply_renderer_head_set_scan_out_buffer (ply_renderer_backend_t *backend,
                                        ply_renderer_head_t    *head,
                                        uint32_t                buffer_id)
 {
+  drmModeModeInfo *mode;
+
+  assert (head->connector_mode_index < head->connector->count_modes);
+  mode = &head->connector->modes[head->connector_mode_index];
 
   /* Tell the controller to use the allocated scan out buffer
    */
   if (drmModeSetCrtc (backend->device_fd, head->controller_id, buffer_id,
-                      0, 0, &head->connector->connector_id, 1, head->mode) < 0)
+                      0, 0, &head->connector->connector_id, 1, mode) < 0)
     return false;
 
   return true;
@@ -546,13 +554,6 @@ close_device (ply_renderer_backend_t *backend)
   unload_driver (backend);
 }
 
-static drmModeModeInfo *
-get_active_mode_for_connector (ply_renderer_backend_t *backend,
-                               drmModeConnector       *connector)
-{
-  return &connector->modes[0];
-}
-
 static bool
 controller_is_available (ply_renderer_backend_t *backend,
                          uint32_t                controller_id)
@@ -724,7 +725,7 @@ create_heads_for_active_connectors (ply_renderer_backend_t *backend)
       uint32_t controller_id;
       uint32_t encoder_id;
       uint32_t console_buffer_id;
-      drmModeModeInfo *mode;
+      int connector_mode_index;
 
       connector = drmModeGetConnector (backend->device_fd,
                                        backend->resources->connectors[i]);
@@ -762,13 +763,19 @@ create_heads_for_active_connectors (ply_renderer_backend_t *backend)
           continue;
         }
 
-      mode = get_active_mode_for_connector (backend, connector);
+      /* The kernel orders the mode list such that the one picked by default is
+       * the first one.
+       *
+       * FIXME: This falls over if the mode is explicitly overridden on
+       * the kernel command line
+       */
+      connector_mode_index = 0;
 
       console_buffer_id = get_console_buffer_id (backend, controller_id);
 
-      head = ply_renderer_head_new (backend, connector, encoder_id,
-                                    controller_id, console_buffer_id,
-                                    mode);
+      head = ply_renderer_head_new (backend, connector, connector_mode_index,
+                                    encoder_id, controller_id,
+                                    console_buffer_id);
 
       ply_list_append_data (backend->heads, head);
     }