[Libva] [PATCH 1/4] Initial code for VAAPI/XV interface. Addin empty i965_output_xv module, render mode attributes, and build code to detect XV.

Ung, Teng En teng.en.ung at intel.com
Mon Sep 16 21:36:15 PDT 2013


Hi,

	From va.h in libva, the VADisplayAttribRenderMode and  VADisplayAttribRenderDevice seems related to each other.  Cause see some "*_LOCAL*" and "*_EXTERNAL*" values in both the attributes, and VADisplayAttribRenderDevice specify external display are for display device not aware from the window manager.  Thus, using the local device (display) and local texture/overlay.

	Anyway, let me know if I miss understood those.

Thanks
Teng

-----Original Message-----
From: Zhao, Yakui 
Sent: Friday, September 13, 2013 1:40 PM
To: Ung, Teng En
Cc: libva at lists.freedesktop.org
Subject: Re: [Libva] [PATCH 1/4] Initial code for VAAPI/XV interface. Addin empty i965_output_xv module, render mode attributes, and build code to detect XV.

On Thu, 2013-09-12 at 20:16 -0600, Ung, Teng En wrote:
> This add in the configuration and makefile to detect XV and build the 
> i965_ouput_xv module.  Also included the VADisplayRenderModeAttr, will 
> only use overlay is user set to overlay render mode.
> 

Generally speaking, this patch set is OK to me except some small concerns. 


> Signed-off-by: Ung, Teng En <teng.en.ung at intel.com>
> ---
>  configure.ac         | 18 ++++++++++
>  src/Makefile.am      |  5 +++
>  src/i965_drv_video.c | 53 ++++++++++++++++++++++++++++--  
> src/i965_drv_video.h |  4 +++  src/i965_output_xv.c | 92 
> ++++++++++++++++++++++++++++++++++++++++++++++++++++
>  src/i965_output_xv.h | 49 ++++++++++++++++++++++++++++
>  6 files changed, 219 insertions(+), 2 deletions(-)  create mode 
> 100644 src/i965_output_xv.c  create mode 100644 src/i965_output_xv.h
> 
> diff --git a/configure.ac b/configure.ac index e39f1d5..79c7642 100644
> --- a/configure.ac
> +++ b/configure.ac
> @@ -51,6 +51,11 @@ AC_ARG_ENABLE(x11,
>                      [build with VA/X11 API support @<:@default=yes@:>@])],
>      [], [enable_x11="yes"])
>  
> +AC_ARG_ENABLE(xv,
> +    [AC_HELP_STRING([--enable-xv],
> +                    [build with X11/XV API support @<:@default=yes@:>@])],
> +    [], [enable_xv="yes"])
> +
>  AC_ARG_ENABLE([wayland],
>      [AC_HELP_STRING([--enable-wayland],
>                      [build with VA/Wayland API support 
> @<:@default=yes@:>@])], @@ -123,6 +128,18 @@ if test "$USE_X11" = 
> "yes"; then  fi  AM_CONDITIONAL(USE_X11, test "$USE_X11" = "yes")
>  
> +dnl Check for X11/XV API
> +USE_XV="$enable_xv"
> +if test "$USE_XV" = "yes"; then
> +    PKG_CHECK_MODULES([X11],  [x11],  [:], [USE_XV="no"])
> +    PKG_CHECK_MODULES([XEXT], [xext], [:], [USE_XV="no"])
> +    PKG_CHECK_MODULES([XV],   [xv],   [:], [USE_XV="no"])
> +    if test "$USE_XV" = "yes"; then
> +        AC_DEFINE([HAVE_X11_XV], [1], [Defined to 1 if X11/XV API is built])
> +    fi
> +fi
> +AM_CONDITIONAL(USE_XV, test "$USE_XV" = "yes")
> +
>  dnl Check for VA-API drivers path
>  AC_MSG_CHECKING([for VA drivers path])  
> LIBVA_DRIVERS_PATH=`$PKG_CONFIG libva --variable driverdir` @@ -188,6 
> +205,7 @@ dnl Print summary  BACKENDS=""
>  AS_IF([test "$USE_DRM" = "yes"], [BACKENDS="$BACKENDS drm"])  
> AS_IF([test "$USE_X11" = "yes"], [BACKENDS="$BACKENDS x11"])
> +AS_IF([test "$USE_XV" = "yes"], [BACKENDS="$BACKENDS xv"])
>  AS_IF([test "$USE_WAYLAND" = "yes"], [BACKENDS="$BACKENDS wayland"])
>  
>  echo
> diff --git a/src/Makefile.am b/src/Makefile.am index 3299733..48a49f1 
> 100755
> --- a/src/Makefile.am
> +++ b/src/Makefile.am
> @@ -129,6 +129,11 @@ noinst_HEADERS			= $(source_h)
>  if USE_X11
>  source_c			+= i965_output_dri.c
>  source_h			+= i965_output_dri.h
> +if USE_XV
> +source_c			+= i965_output_xv.c
> +source_h			+= i965_output_xv.h
> +driver_cflags			+= -lXext -lX11 -lXv 
> +endif
>  endif
>  
>  if USE_WAYLAND
> diff --git a/src/i965_drv_video.c b/src/i965_drv_video.c index 
> ea1f1d0..fb23c8d 100755
> --- a/src/i965_drv_video.c
> +++ b/src/i965_drv_video.c
> @@ -31,6 +31,9 @@
>  
>  #ifdef HAVE_VA_X11
>  # include "i965_output_dri.h"
> +#ifdef HAVE_X11_XV
> +# include "i965_output_xv.h"
> +#endif
>  #endif
>  
>  #ifdef HAVE_VA_WAYLAND
> @@ -101,6 +104,27 @@ static const VADisplayAttribute i965_display_attributes[] = {
>          0, 3, VA_ROTATION_NONE,
>          VA_DISPLAY_ATTRIB_GETTABLE|VA_DISPLAY_ATTRIB_SETTABLE
>      },
> +
> +#ifdef HAVE_X11_XV
> +    /* The render device attribute.  This attributes is used to determine
> +     * whether the device is a local or external before setting the
> +     * gpu/overlay rendering attribute.
> +     */
> +    {
> +        VADisplayAttribRenderDevice,
> +        1, 1, VA_RENDER_DEVICE_LOCAL,
> +        VA_DISPLAY_ATTRIB_GETTABLE
> +    },
> +    /* Render mode attribute.  Use this attribute to control the output in 
> +     * X11 going through DRI (GPU) or XV (overlay/sprite) rendering mode.
> +     * The defeult is DRI rendering mode.
> +     */
> +    {
> +        VADisplayAttribRenderMode,
> +        1, 2, VA_RENDER_MODE_LOCAL_GPU,
> +        VA_DISPLAY_ATTRIB_GETTABLE|VA_DISPLAY_ATTRIB_SETTABLE
> +    },
> +#endif
>  };
>  
>  /* List of supported image formats */ @@ -2412,6 +2436,12 @@ 
> i965_display_attributes_init(VADriverContextP ctx)
>      if (!i965->rotation_attrib) {
>          goto error;
>      }
> +#ifdef HAVE_X11_XV
> +    i965->rendermode_attrib = get_display_attribute(ctx, VADisplayAttribRenderMode);
> +    if (!i965->rendermode_attrib) {
> +        goto error;
> +    }
> +#endif
>      return true;
>  
>  error:
> @@ -3901,6 +3931,10 @@ i965_PutSurface(VADriverContextP ctx,
>                  unsigned int flags) /* de-interlacing flags */  {  
> #ifdef HAVE_VA_X11
> +#ifdef HAVE_X11_XV
> +    struct i965_driver_data *i965 = i965_driver_data(ctx); #endif
> +
>      if (IS_VA_X11(ctx)) {
>          VARectangle src_rect, dst_rect;
>  
> @@ -3914,8 +3948,15 @@ i965_PutSurface(VADriverContextP ctx,
>          dst_rect.width  = destw;
>          dst_rect.height = desth;
>  
> -        return i965_put_surface_dri(ctx, surface, draw, &src_rect, &dst_rect,
> -                                    cliprects, number_cliprects, flags);
> +#ifdef HAVE_X11_XV
> +        /* Check whether using GPU or Overlay rendering mode. */
> +        if (i965->rendermode_attrib->value == VA_RENDER_MODE_LOCAL_OVERLAY)
> +            return i965_put_surface_xv(ctx, surface, draw, &src_rect, &dst_rect,
> +                                       cliprects, number_cliprects, flags);
> +        else
> +#endif

The surface buffer is sent to Xserver and then the Xserver uses the overlay to display the corresponding content.
Does it use the flag of "VA_RENDRR_MODE_LOCAL_OVERLAY"? Maybe the VA_RENDER_MODE_EXTERNAL_OVERLAY is better.

> +            return i965_put_surface_dri(ctx, surface, draw, &src_rect, &dst_rect,
> +                                        cliprects, number_cliprects, 
> + flags);
>      }
>  #endif
>      return VA_STATUS_ERROR_UNIMPLEMENTED; @@ -4887,6 +4928,14 @@ 
> struct {
>          i965_output_dri_terminate,
>          VA_DISPLAY_X11,
>      },
> +
> +#ifdef HAVE_X11_XV
> +    {
> +        i965_output_xv_init,
> +        i965_output_xv_terminate,
> +        VA_DISPLAY_X11,
> +    },
> +#endif
>  #endif
>  };
>  
> diff --git a/src/i965_drv_video.h b/src/i965_drv_video.h index 
> a0e7790..637812d 100644
> --- a/src/i965_drv_video.h
> +++ b/src/i965_drv_video.h
> @@ -321,6 +321,7 @@ struct i965_driver_data
>      VADisplayAttribute *display_attributes;
>      unsigned int num_display_attributes;
>      VADisplayAttribute *rotation_attrib;
> +    VADisplayAttribute *rendermode_attrib;
>      VAContextID current_context_id;
>  
>      /* VA/DRI (X11) specific data */
> @@ -328,6 +329,9 @@ struct i965_driver_data
>  
>      /* VA/Wayland specific data */
>      struct va_wl_output *wl_output;
> +
> +    /* X11/XV (X11) specific data */
> +    struct va_xv_output *xv_output;
>  };
>  
>  #define NEW_CONFIG_ID() object_heap_allocate(&i965->config_heap);
> diff --git a/src/i965_output_xv.c b/src/i965_output_xv.c new file mode 
> 100644 index 0000000..8b361da
> --- /dev/null
> +++ b/src/i965_output_xv.c
> @@ -0,0 +1,92 @@
> +/*
> + * Copyright (C) 2012 Intel Corporation. All Rights Reserved.
> + *
> + * Permission is hereby granted, free of charge, to any person 
> +obtaining a
> + * copy of this software and associated documentation files (the
> + * "Software"), to deal in the Software without restriction, 
> +including
> + * without limitation the rights to use, copy, modify, merge, 
> +publish,
> + * distribute, sub license, and/or sell copies of the Software, and 
> +to
> + * permit persons to whom the Software is furnished to do so, subject 
> +to
> + * the following conditions:
> + *
> + * The above copyright notice and this permission notice (including 
> +the
> + * next paragraph) shall be included in all copies or substantial 
> +portions
> + * of the Software.
> + *
> + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 
> +EXPRESS
> + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
> + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
> + * IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE 
> +FOR
> + * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF 
> +CONTRACT,
> + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
> + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
> + */
> +
> +#include "sysdeps.h"
> +
> +#include <va/va_backend.h>
> +
> +#include "i965_defines.h"
> +#include "i965_drv_video.h"
> +#include "i965_output_xv.h"
> +
> +struct va_xv_output {
> +    int vaxv_port;
> +    unsigned int vaxv_format;
> +};
> +
> +
> +bool
> +i965_output_xv_init(VADriverContextP ctx) {
> +    struct i965_driver_data * const i965 = i965_driver_data(ctx);
> +
> +    i965->xv_output = calloc(1, sizeof(struct va_xv_output));
> +    if (!i965->xv_output) {
> +        goto error;
> +    }
> +
> +    /* Need to addin implementation, currently just disable all those 
> +     * overlay and render attributes.
> +     */
> +    i965->num_display_attributes = 1;
> +
> +    return true;
> +
> +error :
> +    i965->num_display_attributes = 1;
> +    i965_output_xv_terminate(ctx);
> +
> +    /* Just return true to not break the i965_init */
> +    return true;
> +}
> +
> +void
> +i965_output_xv_terminate(VADriverContextP ctx) {
> +    struct i965_driver_data * const i965 = i965_driver_data(ctx);
> +
> +    if (!xv_output)
> +        return;
> +
> +    free(xv_output);
> +    i965->xv_output = NULL;
> +}
> +
> +VAStatus
> +i965_put_surface_xv(
> +    VADriverContextP    ctx,
> +    VASurfaceID         surface,
> +    void               *draw,
> +    const VARectangle  *src_rect,
> +    const VARectangle  *dst_rect,
> +    const VARectangle  *cliprects,
> +    unsigned int        num_cliprects,
> +    unsigned int        flags
> +)
> +{
> +    struct i965_driver_data * const i965 = i965_driver_data(ctx);
> +    struct va_xv_output * const xv_output = i965->xv_output;
> +
> +    return VA_STATUS_ERROR_UNIMPLEMENTED; }
> diff --git a/src/i965_output_xv.h b/src/i965_output_xv.h new file mode 
> 100644 index 0000000..7d0cb91
> --- /dev/null
> +++ b/src/i965_output_xv.h
> @@ -0,0 +1,49 @@
> +/*
> + * Copyright (C) 2012 Intel Corporation. All Rights Reserved.
> + *
> + * Permission is hereby granted, free of charge, to any person 
> +obtaining a
> + * copy of this software and associated documentation files (the
> + * "Software"), to deal in the Software without restriction, 
> +including
> + * without limitation the rights to use, copy, modify, merge, 
> +publish,
> + * distribute, sub license, and/or sell copies of the Software, and 
> +to
> + * permit persons to whom the Software is furnished to do so, subject 
> +to
> + * the following conditions:
> + *
> + * The above copyright notice and this permission notice (including 
> +the
> + * next paragraph) shall be included in all copies or substantial 
> +portions
> + * of the Software.
> + *
> + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 
> +EXPRESS
> + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
> + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
> + * IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE 
> +FOR
> + * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF 
> +CONTRACT,
> + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
> + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
> + */
> +
> +#ifndef I965_OUTPUT_XV_H
> +#define I965_OUTPUT_XV_H
> +
> +#include <stdbool.h>
> +#include <va/va_backend.h>
> +
> +bool
> +i965_output_xv_init(VADriverContextP ctx);
> +
> +void
> +i965_output_xv_terminate(VADriverContextP ctx);
> +
> +VAStatus
> +i965_put_surface_xv(
> +    VADriverContextP    ctx,
> +    VASurfaceID         surface,
> +    void               *draw,
> +    const VARectangle  *src_rect,
> +    const VARectangle  *dst_rect,
> +    const VARectangle  *cliprects,
> +    unsigned int        num_cliprects,
> +    unsigned int        flags
> +);
> +
> +#endif /* I965_OUTPUT_XV_H */




More information about the Libva mailing list