diff --git a/libweston/compositor-drm.c b/libweston/compositor-drm.c index 6ea41ae8..40343839 100644 --- a/libweston/compositor-drm.c +++ b/libweston/compositor-drm.c @@ -657,9 +657,25 @@ drm_output_update_msc(struct drm_output *output, unsigned int seq); static void drm_output_destroy(struct weston_output *output_base); -static int -drm_plane_crtc_supported(struct drm_output *output, struct drm_plane *plane) +/** + * Returns true if the plane can be used on the given output for its current + * repaint cycle. + */ +static bool +drm_plane_is_available(struct drm_plane *plane, struct drm_output *output) { + assert(plane->state_cur); + + /* The plane still has a request not yet completed by the kernel. */ + if (!plane->state_cur->complete) + return false; + + /* The plane is still active on another output. */ + if (plane->state_cur->output && plane->state_cur->output != output) + return false; + + /* Check whether the plane can be used with this CRTC; possible_crtcs + * is a bitmask of CRTC indices (pipe), rather than CRTC object ID. */ return !!(plane->possible_crtcs & (1 << output->pipe)); } @@ -2024,12 +2040,7 @@ drm_output_prepare_overlay_view(struct drm_output_state *output_state, if (p->type != WDRM_PLANE_TYPE_OVERLAY) continue; - if (!drm_plane_crtc_supported(output, p)) - continue; - - if (!p->state_cur->complete) - continue; - if (p->state_cur->output && p->state_cur->output != output) + if (!drm_plane_is_available(p, output)) continue; state = drm_output_state_get_plane(output_state, p);