[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