From 47e3d1e4812b383908128e7dab08bff7f80328d5 Mon Sep 17 00:00:00 2001 From: Marius Vlad Date: Wed, 11 Sep 2019 16:53:08 +0300 Subject: [PATCH] libweston: Add a new helper to check if the view spawns the entire output Helpful to determine if the view can go through the scanout or not. Signed-off-by: Marius Vlad --- libweston/backend-drm/state-propose.c | 7 +------ libweston/compositor.c | 23 +++++++++++++++++++++++ libweston/libweston-internal.h | 3 +++ 3 files changed, 27 insertions(+), 6 deletions(-) diff --git a/libweston/backend-drm/state-propose.c b/libweston/backend-drm/state-propose.c index 148397e9..cb5bffc2 100644 --- a/libweston/backend-drm/state-propose.c +++ b/libweston/backend-drm/state-propose.c @@ -381,7 +381,6 @@ drm_output_prepare_scanout_view(struct drm_output_state *output_state, struct drm_plane *scanout_plane = output->scanout_plane; struct drm_plane_state *state; struct drm_fb *fb; - pixman_box32_t *extents; assert(!b->sprites_are_broken); assert(b->atomic_modeset); @@ -389,11 +388,7 @@ drm_output_prepare_scanout_view(struct drm_output_state *output_state, /* Check the view spans exactly the output size, calculated in the * logical co-ordinate space. */ - extents = pixman_region32_extents(&ev->transform.boundingbox); - if (extents->x1 != output->base.x || - extents->y1 != output->base.y || - extents->x2 != output->base.x + output->base.width || - extents->y2 != output->base.y + output->base.height) + if (!weston_view_matches_output_entirely(ev, &output->base)) return NULL; /* If the surface buffer has an in-fence fd, but the plane doesn't diff --git a/libweston/compositor.c b/libweston/compositor.c index 794253f6..55f43af4 100644 --- a/libweston/compositor.c +++ b/libweston/compositor.c @@ -1864,6 +1864,29 @@ weston_view_has_valid_buffer(struct weston_view *ev) return ev->surface->buffer_ref.buffer != NULL; } +/** Check if the view matches the entire output + * + * @param ev The view to check. + * @param output The output to check against. + * + * Returns true if the view does indeed matches the entire output. + */ +WL_EXPORT bool +weston_view_matches_output_entirely(struct weston_view *ev, + struct weston_output *output) +{ + pixman_box32_t *extents = + pixman_region32_extents(&ev->transform.boundingbox); + + if (extents->x1 != output->x || + extents->y1 != output->y || + extents->x2 != output->x + output->width || + extents->y2 != output->y + output->height) + return false; + + return true; +} + /* Check if a surface has a view assigned to it * * The indicator is set manually when mapping diff --git a/libweston/libweston-internal.h b/libweston/libweston-internal.h index 4c8e35bd..2099f3bc 100644 --- a/libweston/libweston-internal.h +++ b/libweston/libweston-internal.h @@ -290,6 +290,9 @@ weston_view_is_opaque(struct weston_view *ev, pixman_region32_t *region); bool weston_view_has_valid_buffer(struct weston_view *ev); +bool +weston_view_matches_output_entirely(struct weston_view *ev, + struct weston_output *output); void weston_view_move_to_plane(struct weston_view *view, struct weston_plane *plane);