]> git.ipfire.org Git - thirdparty/plymouth.git/commitdiff
drm: ensure modesetting driver supports 32bpp fb
authorRay Strode <rstrode@redhat.com>
Tue, 1 May 2012 16:24:11 +0000 (12:24 -0400)
committerRay Strode <rstrode@redhat.com>
Tue, 1 May 2012 16:30:25 +0000 (12:30 -0400)
Now that more and more hardware is getting kms support,
we need to be more careful about what hardware we try to
run on.  Cirrus cards can't make 32bpp framebuffers, which
is all we support in the drm renderer.

This commit tries to create a small buffer up front, just
to see if the driver will allow it.  If the driver chokes,
then we bail and fall back to the /dev/fb renderer, which
is more tolerant of aging hardware.

src/plugins/renderers/drm/plugin.c

index a418a598bd699211478dd909bbf7ee3606831e89..7cb706307cff815f84a37557dffe6f282d87ab62 100644 (file)
@@ -860,6 +860,28 @@ create_heads_for_active_connectors (ply_renderer_backend_t *backend)
   return ply_list_get_length (backend->heads) > 0;
 }
 
+static bool
+has_32bpp_support (ply_renderer_backend_t *backend)
+{
+    uint32_t buffer_id;
+    unsigned long row_stride;
+
+    buffer_id = backend->driver_interface->create_buffer (backend->driver,
+                                                          1, 1,
+                                                          &row_stride);
+
+    if (buffer_id == 0)
+      {
+        ply_trace ("Could not create 1x1 32bpp dummy buffer");
+        return false;
+      }
+
+    backend->driver_interface->destroy_buffer (backend->driver,
+                                               buffer_id);
+
+    return true;
+}
+
 static bool
 query_device (ply_renderer_backend_t *backend)
 {
@@ -880,6 +902,12 @@ query_device (ply_renderer_backend_t *backend)
       return false;
     }
 
+  if (!has_32bpp_support (backend))
+    {
+      ply_trace ("Device doesn't support 32bpp framebuffer");
+      return false;
+    }
+
   return true;
 }