[PATCH weston 48/68] compositor-drm: Only disallow scaling for overlay planes
Daniel Stone
daniels at collabora.com
Fri Dec 9 19:58:03 UTC 2016
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>
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
More information about the wayland-devel
mailing list