From 3f97b345dd1319d0a63ed1de546ab51e079e7187 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kristian=20H=C3=B8gsberg?= Date: Wed, 16 Oct 2013 16:08:57 -0700 Subject: [PATCH] compositor-drm: Make drm_output_check_scanout_format() work for all formats 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 | 21 ++++++++++----------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/src/compositor-drm.c b/src/compositor-drm.c index 25c34f8c..26f76000 100644 --- a/src/compositor-drm.c +++ b/src/compositor-drm.c @@ -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 *