summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Stone <daniels@collabora.com>2016-11-16 19:40:29 +0000
committerDaniel Stone <daniels@collabora.com>2017-02-07 19:16:33 +0000
commit780a883de8095bed59be6bea0940effcf4ebcaf6 (patch)
tree1562e6f166b6899eba5740924531325a692cc1c7
parentde11f8a3205f084c5370805e82166859dee13e5b (diff)
compositor-drm: Use plane_state_coords_for_view for scanout
Use the shiny new helper we have for working through scanout as well. Signed-off-by: Daniel Stone <daniels@collabora.com> Differential Revision: https://phabricator.freedesktop.org/D1518
-rw-r--r--libweston/compositor-drm.c66
1 files changed, 23 insertions, 43 deletions
diff --git a/libweston/compositor-drm.c b/libweston/compositor-drm.c
index 0634c896..71b3b93a 100644
--- a/libweston/compositor-drm.c
+++ b/libweston/compositor-drm.c
@@ -1488,13 +1488,6 @@ drm_output_assign_state(struct drm_output_state *state,
}
}
-static int
-drm_view_transform_supported(struct weston_view *ev)
-{
- return !ev->transform.enabled ||
- (ev->transform.matrix.type < WESTON_MATRIX_TRANSFORM_ROTATE);
-}
-
static bool
drm_view_is_opaque(struct weston_view *ev)
{
@@ -1526,7 +1519,6 @@ drm_output_prepare_scanout_view(struct drm_output_state *output_state,
struct drm_plane *scanout_plane = output->scanout_plane;
struct drm_plane_state *state;
struct weston_buffer *buffer = ev->surface->buffer_ref.buffer;
- struct weston_buffer_viewport *viewport = &ev->surface->buffer_viewport;
struct gbm_bo *bo;
/* Don't import buffers which span multiple outputs. */
@@ -1542,67 +1534,55 @@ drm_output_prepare_scanout_view(struct drm_output_state *output_state,
if (wl_shm_buffer_get(buffer->resource))
return NULL;
- /* Make sure our view is exactly compatible with the output. */
- if (ev->geometry.x != output->base.x ||
- ev->geometry.y != output->base.y)
- return NULL;
- if (buffer->width != output->base.current_mode->width ||
- buffer->height != output->base.current_mode->height)
- return NULL;
+ state = drm_output_state_get_plane(output_state, scanout_plane);
+ if (state->fb)
+ goto err;
- if (ev->transform.enabled)
- return NULL;
- if (ev->geometry.scissor_enabled)
- 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;
+ state->output = output;
+ drm_plane_state_coords_for_view(state, ev);
+
+ /* The legacy API does not let us perform cropping or scaling. */
+ if (state->src_x != 0 || state->src_y != 0 ||
+ state->src_w != state->dest_w << 16 ||
+ state->src_h != state->dest_h << 16 ||
+ state->dest_x != 0 || state->dest_y != 0 ||
+ state->dest_w != (unsigned) output->base.current_mode->width ||
+ state->dest_h != (unsigned) output->base.current_mode->height)
+ goto err;
if (ev->alpha != 1.0f)
- return NULL;
+ goto err;
bo = gbm_bo_import(b->gbm, GBM_BO_IMPORT_WL_BUFFER,
buffer->resource, GBM_BO_USE_SCANOUT);
/* Unable to use the buffer for scanout */
if (!bo)
- return NULL;
+ goto err;
state = drm_output_state_get_plane(output_state, scanout_plane);
state->fb = drm_fb_get_from_bo(bo, b, drm_view_is_opaque(ev),
BUFFER_CLIENT);
if (!state->fb) {
- drm_plane_state_put_back(state);
+ /* We need to explicitly destroy the BO. */
gbm_bo_destroy(bo);
- return NULL;
+ goto err;
}
/* Can't change formats with just a pageflip */
if (state->fb->format->format != output->gbm_format) {
/* No need to destroy the GBM BO here, as it's now owned
* by the FB. */
- drm_plane_state_put_back(state);
- return NULL;
+ goto err;
}
drm_fb_set_buffer(state->fb, buffer);
- state->output = output;
-
- state->src_x = 0;
- state->src_y = 0;
- state->src_w = ev->surface->width << 16;
- state->src_h = ev->surface->height << 16;
-
- state->dest_x = 0;
- state->dest_y = 0;
- state->dest_w = output->base.width;
- state->dest_h = output->base.height;
-
return &scanout_plane->base;
+
+err:
+ drm_plane_state_put_back(state);
+ return NULL;
}
static struct drm_fb *