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 <dani...@collabora.com>

Differential Revision: https://phabricator.freedesktop.org/D1517
---
 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 b57e2ee..cd89083 100644
--- a/libweston/compositor-drm.c
+++ b/libweston/compositor-drm.c
@@ -2294,7 +2294,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;
@@ -2320,13 +2319,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;
 
@@ -2355,6 +2347,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:
@@ -2373,7 +2371,7 @@ drm_output_prepare_overlay_view(struct drm_output_state 
*output_state,
                };
 
                if (dmabuf->attributes.n_planes != 1 || 
dmabuf->attributes.offset[0] != 0)
-                       return NULL;
+                       goto err;
 
                bo = gbm_bo_import(b->gbm, GBM_BO_IMPORT_FD, &gbm_dmabuf,
                                   GBM_BO_USE_SCANOUT);
@@ -2389,8 +2387,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++)
@@ -2401,15 +2403,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.9.3

_______________________________________________
wayland-devel mailing list
wayland-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/wayland-devel

Reply via email to