[Libva] [PATCH] wayland: Add basic support for creating RGB Wayland buffers

Gwenole Beauchesne gb.devel at gmail.com
Fri Apr 12 21:47:51 PDT 2013


Hi,

2013/4/12 Rob Bradford <robert.bradford at intel.com>:
> From: Rob Bradford <rob at linux.intel.com>
>
> This is a necessary step towards being able to decode to a buffer that the
> Wayland compositor can directly scan out from.
> ---
>  src/i965_output_wayland.c | 71 +++++++++++++++++++++++++++++++++++++++++------
>  1 file changed, 62 insertions(+), 9 deletions(-)
>
> diff --git a/src/i965_output_wayland.c b/src/i965_output_wayland.c
> index fb07b0a..ac86431 100644
> --- a/src/i965_output_wayland.c
> +++ b/src/i965_output_wayland.c
> @@ -205,6 +205,38 @@ create_planar_buffer(
>      return (struct wl_buffer *)id;
>  }
>
> +static struct wl_buffer *
> +create_packed_buffer(
> +    struct va_wl_output *wl_output,
> +    uint32_t             name,
> +    int32_t              width,
> +    int32_t              height,
> +    uint32_t             format,
> +    int32_t              pitch
> +)
> +{
> +    struct wl_vtable * const wl_vtable = &wl_output->vtable;
> +    struct wl_proxy *id;
> +
> +    id = wl_vtable->proxy_create(
> +        (struct wl_proxy *)wl_output->wl_drm,
> +        wl_vtable->buffer_interface
> +    );
> +    if (!id)
> +        return NULL;
> +
> +    wl_vtable->proxy_marshal(
> +        (struct wl_proxy *)wl_output->wl_drm,
> +        WL_DRM_CREATE_BUFFER,
> +        id,
> +        name,
> +        width, height,
> +        pitch,
> +        format
> +    );
> +    return (struct wl_buffer *)id;
> +}
> +
>  /* Hook to return Wayland buffer associated with the VA surface */
>  static VAStatus
>  va_GetSurfaceBufferWl(
> @@ -237,6 +269,15 @@ va_GetSurfaceBufferWl(
>          return VA_STATUS_ERROR_INVALID_SURFACE;
>
>      switch (obj_surface->fourcc) {
> +    case VA_FOURCC_RGB:
> +          drm_format = WL_DRM_FORMAT_RGBX8888;
> +          offsets[0] = 0;
> +          pitches[0] = obj_surface->width * 4;
> +          offsets[1] = 0;
> +          pitches[1] = 0;
> +          offsets[2] = 0;
> +          pitches[2] = 0;
> +          break;
>      case VA_FOURCC('N','V','1','2'):
>          drm_format = WL_DRM_FORMAT_NV12;
>          offsets[0] = 0;
> @@ -279,15 +320,27 @@ va_GetSurfaceBufferWl(
>          return VA_STATUS_ERROR_INVALID_IMAGE_FORMAT;
>      }
>
> -    buffer = create_planar_buffer(
> -        i965->wl_output,
> -        name,
> -        obj_surface->orig_width,
> -        obj_surface->orig_height,
> -        drm_format,
> -        offsets,
> -        pitches
> -    );
> +    if (offsets[1] > 0) {
> +        buffer = create_planar_buffer(
> +            i965->wl_output,
> +            name,
> +            obj_surface->orig_width,
> +            obj_surface->orig_height,
> +            drm_format,
> +            offsets,
> +            pitches
> +        );
> +    } else {
> +        buffer = create_packed_buffer(
> +            i965->wl_output,
> +            name,
> +            obj_surface->orig_width,
> +            obj_surface->orig_height,
> +            drm_format,
> +            pitches[0]
> +        );
> +    }
> +
>      if (!buffer)
>          return VA_STATUS_ERROR_ALLOCATION_FAILED;
>

LGTM. However, in order to make it useful, I think we still somewhat
need protocol extensions whereby we can specify if scan-out is
possible, or not -- and in what format, and additional information
like whether scaling is supported by the engine.

Thanks,
Gwenole.


More information about the Libva mailing list