compositor-drm: Use plane FB-import helper for scanout

Use the same codepath, which has the added advantage of being able to
import dmabufs.

Signed-off-by: Daniel Stone <daniels@collabora.com>
Reviewed-by: Pekka Paalanen <pekka.paalanen@collabora.co.uk>
Tested-by: Emre Ucan <eucan@de.adit-jv.com>
dev
Daniel Stone 8 years ago
parent f11ec02cad
commit bdf3e7e356
  1. 53
      libweston/compositor-drm.c

@ -1750,26 +1750,11 @@ drm_output_prepare_scanout_view(struct drm_output_state *output_state,
struct weston_view *ev) struct weston_view *ev)
{ {
struct drm_output *output = output_state->output; struct drm_output *output = output_state->output;
struct drm_backend *b = to_drm_backend(output->base.compositor);
struct drm_plane *scanout_plane = output->scanout_plane; struct drm_plane *scanout_plane = output->scanout_plane;
struct drm_plane_state *state; struct drm_plane_state *state;
struct weston_buffer *buffer = ev->surface->buffer_ref.buffer; struct drm_fb *fb;
struct gbm_bo *bo;
pixman_box32_t *extents; pixman_box32_t *extents;
/* Don't import buffers which span multiple outputs. */
if (ev->output_mask != (1u << output->base.id))
return NULL;
/* We use GBM to import buffers. */
if (b->gbm == NULL)
return NULL;
if (buffer == NULL)
return NULL;
if (wl_shm_buffer_get(buffer->resource))
return NULL;
/* Check the view spans exactly the output size, calculated in the /* Check the view spans exactly the output size, calculated in the
* logical co-ordinate space. */ * logical co-ordinate space. */
extents = pixman_region32_extents(&ev->transform.boundingbox); extents = pixman_region32_extents(&ev->transform.boundingbox);
@ -1782,15 +1767,27 @@ drm_output_prepare_scanout_view(struct drm_output_state *output_state,
if (ev->alpha != 1.0f) if (ev->alpha != 1.0f)
return NULL; return NULL;
fb = drm_fb_get_from_view(output_state, ev);
if (!fb)
return NULL;
/* Can't change formats with just a pageflip */
if (fb->format->format != output->gbm_format) {
drm_fb_unref(fb);
return NULL;
}
state = drm_output_state_get_plane(output_state, scanout_plane); state = drm_output_state_get_plane(output_state, scanout_plane);
if (state->fb) { if (state->fb) {
/* If there is already a framebuffer on the scanout plane, /* If there is already a framebuffer on the scanout plane,
* a client view has already been placed on the scanout * a client view has already been placed on the scanout
* view. In that case, do not free or put back the state, * view. In that case, do not free or put back the state,
* but just leave it in place and quietly exit. */ * but just leave it in place and quietly exit. */
drm_fb_unref(fb);
return NULL; return NULL;
} }
state->fb = fb;
state->output = output; state->output = output;
if (!drm_plane_state_coords_for_view(state, ev)) if (!drm_plane_state_coords_for_view(state, ev))
goto err; goto err;
@ -1804,30 +1801,6 @@ drm_output_prepare_scanout_view(struct drm_output_state *output_state,
state->dest_h != (unsigned) output->base.current_mode->height) state->dest_h != (unsigned) output->base.current_mode->height)
goto err; 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)
goto err;
state->fb = drm_fb_get_from_bo(bo, b, drm_view_is_opaque(ev),
BUFFER_CLIENT);
if (!state->fb) {
/* We need to explicitly destroy the BO. */
gbm_bo_destroy(bo);
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. */
goto err;
}
drm_fb_set_buffer(state->fb, buffer);
return &scanout_plane->base; return &scanout_plane->base;
err: err:

Loading…
Cancel
Save