[PATCH v14 18/41] compositor-drm: Make alpha-to-opaque handling common
Pekka Paalanen
ppaalanen at gmail.com
Tue Jan 23 13:31:32 UTC 2018
On Wed, 20 Dec 2017 12:26:35 +0000
Daniel Stone <daniels at collabora.com> wrote:
> Rather than a hardcoded ARGB8888 -> XRGB8888 translation inside a
> GBM-specific helper, just determine whether or not the view is opaque,
> and use the generic helpers to implement the format translation.
>
> Signed-off-by: Daniel Stone <daniels at collabora.com>
> ---
> libweston/compositor-drm.c | 111 +++++++++++++++++----------------------------
> 1 file changed, 41 insertions(+), 70 deletions(-)
>
> diff --git a/libweston/compositor-drm.c b/libweston/compositor-drm.c
> index d5955c9ca..d61be4f1b 100644
> --- a/libweston/compositor-drm.c
> +++ b/libweston/compositor-drm.c
> @@ -946,7 +946,7 @@ drm_fb_ref(struct drm_fb *fb)
>
> static struct drm_fb *
> drm_fb_get_from_bo(struct gbm_bo *bo, struct drm_backend *backend,
> - uint32_t format, enum drm_fb_type type)
> + bool is_opaque, enum drm_fb_type type)
> {
> @@ -1665,7 +1662,7 @@ drm_output_render_gl(struct drm_output_state *state, pixman_region32_t *damage)
> return NULL;
> }
>
> - ret = drm_fb_get_from_bo(bo, b, output->gbm_format, BUFFER_GBM_SURFACE);
> + ret = drm_fb_get_from_bo(bo, b, false, BUFFER_GBM_SURFACE);
is_opaque=false is a little counter-intuitive here, because our
renderers always produce opaque images. I suppose the intention here is
to use the bo format as is. Would it warrant a comment on why we want
that?
> if (!ret) {
> weston_log("failed to get drm_fb for bo\n");
> gbm_surface_release_buffer(output->gbm_surface, bo);
> @@ -2763,12 +2731,16 @@ drm_output_prepare_overlay_view(struct drm_output_state *output_state,
> if (!bo)
> goto err;
>
> - format = drm_output_check_plane_format(p, ev, bo);
> - if (format == 0)
> + state->fb = drm_fb_get_from_bo(bo, b, drm_view_is_opaque(ev),
> + BUFFER_CLIENT);
> + if (!state->fb)
> goto err;
>
> - state->fb = drm_fb_get_from_bo(bo, b, format, BUFFER_CLIENT);
> - if (!state->fb)
> + /* Check whether the format is supported */
> + for (i = 0; i < p->count_formats; i++)
> + if (p->formats[i] == state->fb->format->format)
> + break;
> + if (i == p->count_formats)
> goto err;
The error path calls gbm_bo_destroy(), it probably shouldn't.
>
> drm_fb_set_buffer(state->fb, ev->surface->buffer_ref.buffer);
> @@ -3992,8 +3964,7 @@ drm_output_init_cursor_egl(struct drm_output *output, struct drm_backend *b)
> goto err;
>
> output->gbm_cursor_fb[i] =
> - drm_fb_get_from_bo(bo, b, GBM_FORMAT_ARGB8888,
> - BUFFER_CURSOR);
> + drm_fb_get_from_bo(bo, b, false, BUFFER_CURSOR);
> if (!output->gbm_cursor_fb[i]) {
> gbm_bo_destroy(bo);
> goto err;
Other than those, looks good to me.
Thanks,
pq
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 833 bytes
Desc: OpenPGP digital signature
URL: <https://lists.freedesktop.org/archives/wayland-devel/attachments/20180123/3f75a1c7/attachment-0001.sig>
More information about the wayland-devel
mailing list