From de11f8a3205f084c5370805e82166859dee13e5b Mon Sep 17 00:00:00 2001 From: Daniel Stone Date: Wed, 16 Nov 2016 19:35:03 +0000 Subject: [XXX] compositor-drm: Only disallow scaling for overlay planes 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 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 1fd95e4d..0634c896 100644 --- a/libweston/compositor-drm.c +++ b/libweston/compositor-drm.c @@ -2277,7 +2277,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; @@ -2303,13 +2302,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; @@ -2338,6 +2330,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: @@ -2367,7 +2365,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); @@ -2383,8 +2381,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++) @@ -2395,15 +2397,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; } -- cgit v1.2.3