[PATCH v20 09/10] compositor-drm: Relax plane restrictions for atomic
Daniel Stone
daniels at collabora.com
Wed Jul 11 10:41:33 UTC 2018
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>
Reviewed-by: Pekka Paalanen <pekka.paalanen at collabora.co.uk>
---
libweston/compositor-drm.c | 20 ++++++++++++--------
1 file changed, 12 insertions(+), 8 deletions(-)
diff --git a/libweston/compositor-drm.c b/libweston/compositor-drm.c
index d664a8df5..284385d10 100644
--- a/libweston/compositor-drm.c
+++ b/libweston/compositor-drm.c
@@ -1980,7 +1980,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;
}
@@ -2010,15 +2010,18 @@ drm_output_prepare_scanout_view(struct drm_output_state *output_state,
if (!drm_plane_state_coords_for_view(state, ev))
goto err;
- /* 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;
+
/* In plane-only mode, we don't need to test the state now, as we
* will only test it once at the end. */
if (mode == DRM_OUTPUT_PROPOSE_STATE_PLANES_ONLY) {
@@ -3126,8 +3129,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;
}
--
2.17.1
More information about the wayland-devel
mailing list