]> git.ipfire.org Git - thirdparty/plymouth.git/commitdiff
drm: don't set mode initially if on different vt
authorRay Strode <rstrode@redhat.com>
Wed, 6 Jun 2012 15:51:47 +0000 (11:51 -0400)
committerRay Strode <rstrode@redhat.com>
Wed, 6 Jun 2012 14:13:00 +0000 (10:13 -0400)
In the shutdown path we start out on a different
vt than where the splash is drawn.  Make sure we
don't set a mode until the jump.

This prevents unnecessary flicker.

src/plugins/renderers/drm/plugin.c

index c19d6710721d13c2c14f040fb9cac0a567bee0e3..a4fe3befd192ce1030fa0cd37afcc67a1846e769 100644 (file)
@@ -134,6 +134,8 @@ static void ply_renderer_head_redraw (ply_renderer_backend_t *backend,
                                       ply_renderer_head_t    *head);
 static bool open_input_source (ply_renderer_backend_t      *backend,
                                ply_renderer_input_source_t *input_source);
+static bool reset_scan_out_buffer_if_needed (ply_renderer_backend_t *backend,
+                                             ply_renderer_head_t    *head);
 
 static bool
 ply_renderer_head_add_connector (ply_renderer_head_t *head,
@@ -230,6 +232,9 @@ ply_renderer_head_set_scan_out_buffer (ply_renderer_backend_t *backend,
 
   mode = &head->connector0->modes[head->connector0_mode_index];
 
+  ply_trace ("Setting scan out buffer of %ldx%ld head to our buffer",
+             head->area.width, head->area.height);
+
   /* Tell the controller to use the allocated scan out buffer on each connectors
   */
   if (drmModeSetCrtc (backend->device_fd, head->controller_id, buffer_id,
@@ -247,6 +252,8 @@ static bool
 ply_renderer_head_map (ply_renderer_backend_t *backend,
                        ply_renderer_head_t    *head)
 {
+  bool scan_out_set;
+
   assert (backend != NULL);
   assert (backend->device_fd >= 0);
   assert (backend->driver_interface != NULL);
@@ -278,10 +285,8 @@ ply_renderer_head_map (ply_renderer_backend_t *backend,
    */
   ply_renderer_head_redraw (backend, head);
 
-  ply_trace ("Setting scan out buffer of %ldx%ld head to our buffer",
-             head->area.width, head->area.height);
-  if (!ply_renderer_head_set_scan_out_buffer (backend, head,
-                                              head->scan_out_buffer_id))
+  scan_out_set = reset_scan_out_buffer_if_needed (backend, head);
+  if (!scan_out_set && backend->is_active)
     {
       backend->driver_interface->destroy_buffer (backend->driver,
                                                  head->scan_out_buffer_id);
@@ -1094,28 +1099,31 @@ unmap_from_device (ply_renderer_backend_t *backend)
     }
 }
 
-static void
+static bool
 reset_scan_out_buffer_if_needed (ply_renderer_backend_t *backend,
                                  ply_renderer_head_t    *head)
 {
   drmModeCrtc *controller;
+  bool did_reset = false;
 
   if (!ply_terminal_is_active (backend->terminal))
-    return;
+    return false;
 
   controller = drmModeGetCrtc (backend->device_fd, head->controller_id);
 
   if (controller == NULL)
-    return;
+    return false;
 
   if (controller->buffer_id != head->scan_out_buffer_id)
     {
-      ply_trace ("Something stole the monitor");
       ply_renderer_head_set_scan_out_buffer (backend, head,
                                              head->scan_out_buffer_id);
+      did_reset = true;
     }
 
   drmModeFreeCrtc (controller);
+
+  return did_reset;
 }
 
 static void
@@ -1153,7 +1161,10 @@ flush_head (ply_renderer_backend_t *backend,
 
       next_node = ply_list_get_next_node (areas_to_flush, node);
 
-      reset_scan_out_buffer_if_needed (backend, head);
+      if (reset_scan_out_buffer_if_needed (backend, head))
+        ply_trace ("Needed to reset scan out buffer on %ldx%ld renderer head",
+                   head->area.width, head->area.height);
+
       ply_renderer_head_flush_area (head, area_to_flush, map_address);
 
       node = next_node;