[PATCH weston v12 37/40] compositor-drm: Relax plane restrictions for atomic

Daniel Stone daniels at collabora.com
Tue Sep 26 17:16:10 UTC 2017


Since we now incrementally test atomic state as we build it, we can
loosen restrictions on what we can do with planes, and let the kernel
tell us whether or not it's OK.

Signed-off-by: Daniel Stone <daniels at collabora.com>
---
 libweston/compositor-drm.c | 22 ++++++++++++++--------
 1 file changed, 14 insertions(+), 8 deletions(-)

diff --git a/libweston/compositor-drm.c b/libweston/compositor-drm.c
index e678fa7d..05082af1 100644
--- a/libweston/compositor-drm.c
+++ b/libweston/compositor-drm.c
@@ -1733,6 +1733,7 @@ drm_output_prepare_scanout_view(struct drm_output_state *output_state,
 				enum drm_output_propose_state_mode mode)
 {
 	struct drm_output *output = output_state->output;
+	struct drm_backend *b = to_drm_backend(output->base.compositor);
 	struct drm_plane *scanout_plane = output->scanout_plane;
 	struct drm_plane_state *state;
 	struct drm_plane_state *state_old = NULL;
@@ -1744,7 +1745,7 @@ drm_output_prepare_scanout_view(struct drm_output_state *output_state,
 		return NULL;
 
 	/* Can't change formats with just a pageflip */
-	if (fb->format->format != output->gbm_format) {
+	if (!b->atomic_modeset && fb->format->format != output->gbm_format) {
 		drm_fb_unref(fb);
 		return NULL;
 	}
@@ -1769,15 +1770,18 @@ drm_output_prepare_scanout_view(struct drm_output_state *output_state,
 	state->output = output;
 	drm_plane_state_coords_for_view(state, ev);
 
-	/* The legacy API does not let us perform cropping or scaling. */
-	if (state->src_x != 0 || state->src_y != 0 ||
-	    state->src_w != state->dest_w << 16 ||
-	    state->src_h != state->dest_h << 16 ||
-	    state->dest_x != 0 || state->dest_y != 0 ||
+	if (state->dest_x != 0 || state->dest_y != 0 ||
 	    state->dest_w != (unsigned) output->base.current_mode->width ||
 	    state->dest_h != (unsigned) output->base.current_mode->height)
 		goto err;
 
+	/* The legacy API does not let us perform cropping or scaling. */
+	if (!b->atomic_modeset &&
+	    (state->src_x != 0 || state->src_y != 0 ||
+	     state->src_w != state->dest_w << 16 ||
+	     state->src_h != state->dest_h << 16))
+		goto err;
+
 	if (mode == DRM_OUTPUT_PROPOSE_STATE_PLANES_ONLY)
 		return state;
 
@@ -2822,8 +2826,9 @@ drm_output_prepare_overlay_view(struct drm_output_state *output_state,
 		state->ev = ev;
 		state->output = output;
 		drm_plane_state_coords_for_view(state, ev);
-		if (state->src_w != state->dest_w << 16 ||
-		    state->src_h != state->dest_h << 16) {
+		if (!b->atomic_modeset &&
+		    (state->src_w != state->dest_w << 16 ||
+		     state->src_h != state->dest_h << 16)) {
 			drm_plane_state_put_back(state);
 			continue;
 		}
@@ -3170,6 +3175,7 @@ drm_output_propose_state(struct weston_output *output_base,
 					      &clipped_view);
 			pixman_region32_fini(&clipped_view);
 			continue;
+		}
 		if (!renderer_ok) {
 			pixman_region32_fini(&clipped_view);
 			goto err;
-- 
2.14.1



More information about the wayland-devel mailing list