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 <marius.vlad@collabora.com>
This commit is contained in:
Marius Vlad 2019-09-11 16:53:08 +03:00 committed by Daniel Stone
parent 5f6bee49ed
commit 47e3d1e481
3 changed files with 27 additions and 6 deletions

View File

@ -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 *scanout_plane = output->scanout_plane;
struct drm_plane_state *state; struct drm_plane_state *state;
struct drm_fb *fb; struct drm_fb *fb;
pixman_box32_t *extents;
assert(!b->sprites_are_broken); assert(!b->sprites_are_broken);
assert(b->atomic_modeset); 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 /* Check the view spans exactly the output size, calculated in the
* logical co-ordinate space. */ * logical co-ordinate space. */
extents = pixman_region32_extents(&ev->transform.boundingbox); if (!weston_view_matches_output_entirely(ev, &output->base))
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)
return NULL; return NULL;
/* If the surface buffer has an in-fence fd, but the plane doesn't /* If the surface buffer has an in-fence fd, but the plane doesn't

View File

@ -1864,6 +1864,29 @@ weston_view_has_valid_buffer(struct weston_view *ev)
return ev->surface->buffer_ref.buffer != NULL; 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 /* Check if a surface has a view assigned to it
* *
* The indicator is set manually when mapping * The indicator is set manually when mapping

View File

@ -290,6 +290,9 @@ weston_view_is_opaque(struct weston_view *ev, pixman_region32_t *region);
bool bool
weston_view_has_valid_buffer(struct weston_view *ev); weston_view_has_valid_buffer(struct weston_view *ev);
bool
weston_view_matches_output_entirely(struct weston_view *ev,
struct weston_output *output);
void void
weston_view_move_to_plane(struct weston_view *view, weston_view_move_to_plane(struct weston_view *view,
struct weston_plane *plane); struct weston_plane *plane);