compositor-drm: Make drm_output_check_scanout_format() work for all formats
authorKristian Høgsberg <krh@bitplanet.net>
Wed, 16 Oct 2013 23:08:57 +0000 (16:08 -0700)
committerKristian Høgsberg <krh@bitplanet.net>
Wed, 16 Oct 2013 23:09:23 +0000 (16:09 -0700)
This used to work only for ARGB8888 and XRGB8888 buffers, but this lets
us support pageflipping to any client buffer as long as it matches the
framebuffer format.

src/compositor-drm.c

index 25c34f8..26f7600 100644 (file)
@@ -413,32 +413,31 @@ static uint32_t
 drm_output_check_scanout_format(struct drm_output *output,
                                struct weston_surface *es, struct gbm_bo *bo)
 {
+       struct drm_compositor *c =
+               (struct drm_compositor *) output->base.compositor;
        uint32_t format;
        pixman_region32_t r;
 
        format = gbm_bo_get_format(bo);
 
-       switch (format) {
-       case GBM_FORMAT_XRGB8888:
-               return format;
-       case GBM_FORMAT_ARGB8888:
-               /* We can only scanout an ARGB buffer if the surface's
-                * opaque region covers the whole output */
+       if (format == GBM_FORMAT_ARGB8888) {
+               /* We can scanout an ARGB buffer if the surface's
+                * opaque region covers the whole output, but we have
+                * to use XRGB as the KMS format code. */
                pixman_region32_init(&r);
                pixman_region32_subtract(&r, &output->base.region,
                                         &es->opaque);
 
                if (!pixman_region32_not_empty(&r))
                        format = GBM_FORMAT_XRGB8888;
-               else
-                       format = 0;
 
                pixman_region32_fini(&r);
+       }
 
+       if (c->format == format)
                return format;
-       default:
-               return 0;
-       }
+
+       return 0;
 }
 
 static struct weston_plane *