[PATCH v14 21/41] [XXX] compositor-drm: Only disallow scaling for overlay planes

Daniel Stone daniels at collabora.com
Wed Dec 20 12:26:38 UTC 2017


Now we have a more comprehensive overview of the transform we're going
to apply, use this to explicitly disallow scaling and rotation.

XXX: This does not actually disallow rotation for square surfaces.
     We would have to build up a full buffer->view->output transform
     matrix, and then analyse that.

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

diff --git a/libweston/compositor-drm.c b/libweston/compositor-drm.c
index 001eb5278..10bc53ba0 100644
--- a/libweston/compositor-drm.c
+++ b/libweston/compositor-drm.c
@@ -2684,7 +2684,6 @@ drm_output_prepare_overlay_view(struct drm_output_state *output_state,
 {
 	struct drm_output *output = output_state->output;
 	struct weston_compositor *ec = output->base.compositor;
-	struct weston_buffer_viewport *viewport = &ev->surface->buffer_viewport;
 	struct drm_backend *b = to_drm_backend(ec);
 	struct wl_resource *buffer_resource;
 	struct drm_plane *p;
@@ -2710,13 +2709,6 @@ drm_output_prepare_overlay_view(struct drm_output_state *output_state,
 	if (wl_shm_buffer_get(buffer_resource))
 		return NULL;
 
-	if (viewport->buffer.transform != output->base.transform)
-		return NULL;
-	if (viewport->buffer.scale != output->base.current_scale)
-		return NULL;
-	if (!drm_view_transform_supported(ev))
-		return NULL;
-
 	if (ev->alpha != 1.0f)
 		return NULL;
 
@@ -2740,6 +2732,12 @@ drm_output_prepare_overlay_view(struct drm_output_state *output_state,
 	if (!state)
 		return NULL;
 
+	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)
+		goto err;
+
 	if ((dmabuf = linux_dmabuf_buffer_get(buffer_resource))) {
 #ifdef HAVE_GBM_FD_IMPORT
 		/* XXX: TODO:
@@ -2769,7 +2767,7 @@ drm_output_prepare_overlay_view(struct drm_output_state *output_state,
 		if (dmabuf->attributes.n_planes != 1 ||
                     dmabuf->attributes.offset[0] != 0 ||
 		    dmabuf->attributes.flags)
-			return NULL;
+			goto err;
 
 		bo = gbm_bo_import(b->gbm, GBM_BO_IMPORT_FD, &gbm_dmabuf,
 				   GBM_BO_USE_SCANOUT);
@@ -2785,8 +2783,12 @@ drm_output_prepare_overlay_view(struct drm_output_state *output_state,
 
 	state->fb = drm_fb_get_from_bo(bo, b, drm_view_is_opaque(ev),
 				       BUFFER_CLIENT);
-	if (!state->fb)
+	if (!state->fb) {
+		/* Destroy the BO as we've allocated it, but it won't yet
+		 * be deallocated by the state. */
+		gbm_bo_destroy(bo);
 		goto err;
+	}
 
 	/* Check whether the format is supported */
 	for (i = 0; i < p->count_formats; i++)
@@ -2797,15 +2799,10 @@ drm_output_prepare_overlay_view(struct drm_output_state *output_state,
 
 	drm_fb_set_buffer(state->fb, ev->surface->buffer_ref.buffer);
 
-	state->output = output;
-	drm_plane_state_coords_for_view(state, ev);
-
 	return &p->base;
 
 err:
 	drm_plane_state_put_back(state);
-	if (bo)
-		gbm_bo_destroy(bo);
 	return NULL;
 }
 
-- 
2.14.3



More information about the wayland-devel mailing list