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));
}
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);