summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Stone <daniels@collabora.com>2016-11-16 19:35:03 +0000
committerDaniel Stone <daniels@collabora.com>2017-02-07 19:16:32 +0000
commitde11f8a3205f084c5370805e82166859dee13e5b (patch)
tree45f7bbefefc5305eb94e35e7cf07e0582d2c92b5
parentc022765ae099a56257e86a10072a0ffbd9ad4b85 (diff)
[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 <daniels@collabora.com> Differential Revision: https://phabricator.freedesktop.org/D1517
-rw-r--r--libweston/compositor-drm.c27
1 files 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;
}