[Libva] [PATCH 2/5] API: introduce DRM common utilities and data structures.

Xiang, Haihao haihao.xiang at intel.com
Wed Jul 4 20:18:10 PDT 2012


On Mon, 2012-07-02 at 18:25 +0200, Gwenole Beauchesne wrote: 
> From: Benjamin Franzke <benjaminfranzke at googlemail.com>
> 
> Add <va/va_drmcommon.h> header for DRM-based drivers to use common
> base utilities and data structures. So far, only the DRM state is
> shared to that to maintain binary compatibility.
> 
> Signed-off-by: Gwenole Beauchesne <gwenole.beauchesne at intel.com>
> ---
>  va/Makefile.am            |    1 +
>  va/android/va_android.cpp |   14 +++++++-------
>  va/va_drmcommon.h         |   46 +++++++++++++++++++++++++++++++++++++++++++++
>  va/x11/dri1_util.c        |   24 +++++++++++------------
>  va/x11/dri2_util.c        |   24 +++++++++++------------
>  va/x11/va_dricommon.h     |   12 ++----------
>  6 files changed, 80 insertions(+), 41 deletions(-)
>  create mode 100644 va/va_drmcommon.h
> 
> diff --git a/va/Makefile.am b/va/Makefile.am
> index 1d03e9d..47b7ba6 100644
> --- a/va/Makefile.am
> +++ b/va/Makefile.am
> @@ -46,6 +46,7 @@ libva_source_h = \
>  	va_compat.h		\
>  	va_dec_jpeg.h		\
>  	va_dec_vp8.h		\
> +	va_drmcommon.h		\
>  	va_dummy.h		\
>  	va_enc.h		\
>  	va_enc_h264.h		\
> diff --git a/va/android/va_android.cpp b/va/android/va_android.cpp
> index 51f1f51..38c91e4 100644
> --- a/va/android/va_android.cpp
> +++ b/va/android/va_android.cpp
> @@ -96,7 +96,7 @@ static void va_DisplayContextDestroy (
>  
>      /* close the open-ed DRM fd */
>      dri_state = (struct dri_state *)pDisplayContext->pDriverContext->dri_state;
> -    close(dri_state->fd);
> +    close(dri_state->base.fd);
>  
>      free(pDisplayContext->pDriverContext->dri_state);
>      free(pDisplayContext->pDriverContext);
> @@ -126,9 +126,9 @@ static VAStatus va_DisplayContextGetDriverName (
>      };
>  
>      memset(dri_state, 0, sizeof(*dri_state));
> -    dri_state->fd = open_device((char *)DEVICE_NAME);
> +    dri_state->base.fd = open_device((char *)DEVICE_NAME);
>      
> -    if (dri_state->fd < 0) {
> +    if (dri_state->base.fd < 0) {
>          fprintf(stderr,"can't open DRM devices\n");
>          return VA_STATUS_ERROR_UNKNOWN;
>      }
> @@ -138,7 +138,7 @@ static VAStatus va_DisplayContextGetDriverName (
>      device_id = devices[0].device_id;
>      *driver_name = strdup(devices[0].driver_name);
>          
> -    dri_state->driConnectedFlag = VA_DUMMY;
> +    dri_state->base.type = VA_DUMMY;
>  
>      return VA_STATUS_SUCCESS;
>  }
> @@ -166,9 +166,9 @@ static VAStatus va_DisplayContextGetDriverName (
>      };
>  
>      memset(dri_state, 0, sizeof(*dri_state));
> -    dri_state->fd = drm_open_any(&vendor_id, &device_id);
> +    dri_state->base.fd = drm_open_any(&vendor_id, &device_id);
>      
> -    if (dri_state->fd < 0) {
> +    if (dri_state->base.fd < 0) {
>          fprintf(stderr,"can't open DRM devices\n");
>          return VA_STATUS_ERROR_UNKNOWN;
>      }
> @@ -194,7 +194,7 @@ static VAStatus va_DisplayContextGetDriverName (
>      printf("DRM device is opened, loading driver %s for device 0x%04x:0x%04x\n",
>             driver_name, vendor_id, device_id);
>      
> -    dri_state->driConnectedFlag = VA_DUMMY;
> +    dri_state->base.type = VA_DUMMY;
>  
>      return VA_STATUS_SUCCESS;
>  }
> diff --git a/va/va_drmcommon.h b/va/va_drmcommon.h
> new file mode 100644
> index 0000000..98a8b4d
> --- /dev/null
> +++ b/va/va_drmcommon.h
> @@ -0,0 +1,46 @@
> +/*
> + * va_drmcommon.h - Common utilities for DRM-based drivers
> + *
> + * 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 INTEL 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 VA_DRM_COMMON_H
> +#define VA_DRM_COMMON_H
> +
> +/** \brief DRM connection types. */
> +enum {
> +    VA_NONE     = 0,
> +    VA_DRI1     = 1,
> +    VA_DRI2     = 2,
> +    VA_DUMMY    = 3,
> +};
> +
> +/** \brief Base DRM state. */
> +struct drm_state {
> +    /** \brief DRM connection descriptor. */
> +    int         fd;
> +    /** \brief DRM connection type. */
> +    int         type;
> +};

It doesn't make sense to me. Does it mean DRM connection also is based
on DRI1/DRI2 protocols ?

> +
> +#endif /* VA_DRM_COMMON_H */
> diff --git a/va/x11/dri1_util.c b/va/x11/dri1_util.c
> index 7e5abf8..6344754 100644
> --- a/va/x11/dri1_util.c
> +++ b/va/x11/dri1_util.c
> @@ -65,8 +65,8 @@ dri1Close(VADriverContextP ctx)
>      VA_DRIDestroyContext(ctx->native_dpy, ctx->x11_screen, dri_state->hwContextID);
>      assert(dri_state->pSAREA != MAP_FAILED);
>      drmUnmap(dri_state->pSAREA, SAREA_MAX);
> -    assert(dri_state->fd >= 0);
> -    drmCloseOnce(dri_state->fd);
> +    assert(dri_state->base.fd >= 0);
> +    drmCloseOnce(dri_state->base.fd);
>      VA_DRICloseConnection(ctx->native_dpy, ctx->x11_screen);
>  }
>  
> @@ -83,9 +83,9 @@ isDRI1Connected(VADriverContextP ctx, char **driver_name)
>      drm_magic_t magic;        
>  
>      *driver_name = NULL;
> -    dri_state->fd = -1;
> +    dri_state->base.fd = -1;
>      dri_state->pSAREA = MAP_FAILED;
> -    dri_state->driConnectedFlag = VA_NONE;
> +    dri_state->base.type = VA_NONE;
>  
>      if (!VA_DRIQueryDirectRenderingCapable(ctx->native_dpy, 
>                                             ctx->x11_screen, 
> @@ -105,20 +105,20 @@ isDRI1Connected(VADriverContextP ctx, char **driver_name)
>          goto err_out0;
>  
>      
> -    dri_state->fd = drmOpenOnce(NULL, BusID, &newlyopened);
> +    dri_state->base.fd = drmOpenOnce(NULL, BusID, &newlyopened);
>      XFree(BusID);
>  
> -    if (dri_state->fd < 0)
> +    if (dri_state->base.fd < 0)
>          goto err_out1;
>  
> 
> -    if (drmGetMagic(dri_state->fd, &magic))
> +    if (drmGetMagic(dri_state->base.fd, &magic))
>          goto err_out1;
>  
>      if (newlyopened && !VA_DRIAuthConnection(ctx->native_dpy, ctx->x11_screen, magic))
>          goto err_out1;
>  
> -    if (drmMap(dri_state->fd, dri_state->hSAREA, SAREA_MAX, &dri_state->pSAREA))
> +    if (drmMap(dri_state->base.fd, dri_state->hSAREA, SAREA_MAX, &dri_state->pSAREA))
>          goto err_out1;
>  
>      if (!VA_DRICreateContext(ctx->native_dpy, ctx->x11_screen,
> @@ -126,7 +126,7 @@ isDRI1Connected(VADriverContextP ctx, char **driver_name)
>                               &dri_state->hwContextID, &dri_state->hwContext))
>          goto err_out1;
>  
> -    dri_state->driConnectedFlag = VA_DRI1;
> +    dri_state->base.type = VA_DRI1;
>      dri_state->createDrawable = dri1CreateDrawable;
>      dri_state->destroyDrawable = dri1DestroyDrawable;
>      dri_state->swapBuffer = dri1SwapBuffer;
> @@ -139,8 +139,8 @@ err_out1:
>      if (dri_state->pSAREA != MAP_FAILED)
>          drmUnmap(dri_state->pSAREA, SAREA_MAX);
>  
> -    if (dri_state->fd >= 0)
> -        drmCloseOnce(dri_state->fd);
> +    if (dri_state->base.fd >= 0)
> +        drmCloseOnce(dri_state->base.fd);
>  
>      VA_DRICloseConnection(ctx->native_dpy, ctx->x11_screen);
>  
> @@ -149,7 +149,7 @@ err_out0:
>          XFree(*driver_name);
>  
>      dri_state->pSAREA = MAP_FAILED;
> -    dri_state->fd = -1;
> +    dri_state->base.fd = -1;
>      *driver_name = NULL;
>      
>      return False;
> diff --git a/va/x11/dri2_util.c b/va/x11/dri2_util.c
> index ab3f58a..753517f 100644
> --- a/va/x11/dri2_util.c
> +++ b/va/x11/dri2_util.c
> @@ -168,8 +168,8 @@ dri2Close(VADriverContextP ctx)
>  
>      free_drawable_hashtable(ctx);
>  
> -    if (dri_state->fd >= 0);
> -	close(dri_state->fd);
> +    if (dri_state->base.fd >= 0);
> +	close(dri_state->base.fd);
>  }
>  
>  Bool 
> @@ -182,8 +182,8 @@ isDRI2Connected(VADriverContextP ctx, char **driver_name)
>      char *device_name = NULL;
>      drm_magic_t magic;        
>      *driver_name = NULL;
> -    dri_state->fd = -1;
> -    dri_state->driConnectedFlag = VA_NONE;
> +    dri_state->base.fd = -1;
> +    dri_state->base.type = VA_NONE;
>      if (!VA_DRI2QueryExtension(ctx->native_dpy, &event_base, &error_base))
>          goto err_out;
>  
> @@ -195,20 +195,20 @@ isDRI2Connected(VADriverContextP ctx, char **driver_name)
>                       driver_name, &device_name))
>          goto err_out;
>  
> -    dri_state->fd = open(device_name, O_RDWR);
> -    assert(dri_state->fd >= 0);
> +    dri_state->base.fd = open(device_name, O_RDWR);
> +    assert(dri_state->base.fd >= 0);
>  
> -    if (dri_state->fd < 0)
> +    if (dri_state->base.fd < 0)
>          goto err_out;
>  
> -    if (drmGetMagic(dri_state->fd, &magic))
> +    if (drmGetMagic(dri_state->base.fd, &magic))
>          goto err_out;
>  
>      if (!VA_DRI2Authenticate(ctx->native_dpy, RootWindow(ctx->native_dpy, ctx->x11_screen),
>                            magic))
>          goto err_out;
>  
> -    dri_state->driConnectedFlag = VA_DRI2;
> +    dri_state->base.type = VA_DRI2;
>      dri_state->createDrawable = dri2CreateDrawable;
>      dri_state->destroyDrawable = dri2DestroyDrawable;
>      dri_state->swapBuffer = dri2SwapBuffer;
> @@ -228,11 +228,11 @@ err_out:
>      if (*driver_name)
>          Xfree(*driver_name);
>  
> -    if (dri_state->fd >= 0)
> -        close(dri_state->fd);
> +    if (dri_state->base.fd >= 0)
> +        close(dri_state->base.fd);
>  
>      *driver_name = NULL;
> -    dri_state->fd = -1;
> +    dri_state->base.fd = -1;
>      
>      return False;
>  }
> diff --git a/va/x11/va_dricommon.h b/va/x11/va_dricommon.h
> index ac58735..536a508 100644
> --- a/va/x11/va_dricommon.h
> +++ b/va/x11/va_dricommon.h
> @@ -32,20 +32,13 @@
>  #endif
>  
>  #include <va/va_backend.h>
> +#include <va/va_drmcommon.h>
>  
>  #ifdef ANDROID
>  #define XID unsigned int
>  #define Bool int
>  #endif
>  
> -enum
> -{
> -    VA_NONE = 0,
> -    VA_DRI1 = 1,
> -    VA_DRI2 = 2,
> -    VA_DUMMY = 3
> -};
> -
>  union dri_buffer 
>  {
>      struct {
> @@ -74,8 +67,7 @@ struct dri_drawable
>  #define DRAWABLE_HASH_SZ 32
>  struct dri_state 
>  {
> -    int fd;
> -    int driConnectedFlag; /* 0: disconnected, 1: DRI, 2: DRI2 */
> +    struct drm_state base;
>  #ifndef ANDROID
>      drm_handle_t hSAREA;
>      drm_context_t hwContext;




More information about the Libva mailing list