Change the driver used for android. Libva has to load the correct driver and retain the vendor and device id's.
This change is to re-use common drm utils code for driver name detection. Also removed non-android code in android specific files and unneeded files in android directory. Change-Id: I2893d8fcadfbf911e7c0b421a4e90d5aeb0d619e Signed-off-by: Daniel Charles <daniel.char...@intel.com> (change driver) Signed-off-by: Haitao Huang <haitao.hu...@intel.com> (update using drm util) --- va/Android.mk | 8 ++- va/android/drmtest.c | 139 ------------------------------------------- va/android/drmtest.h | 40 ------------ va/android/va_android.cpp | 145 +++++++------------------------------------- 4 files changed, 28 insertions(+), 304 deletions(-) delete mode 100644 va/android/drmtest.c delete mode 100644 va/android/drmtest.h diff --git a/va/Android.mk b/va/Android.mk index 0da4ec2..c94cf7f 100755 --- a/va/Android.mk +++ b/va/Android.mk @@ -92,14 +92,16 @@ LOCAL_GENERATED_SOURCES += $(GEN) include $(CLEAR_VARS) LOCAL_SRC_FILES := \ - android/va_android.cpp + android/va_android.cpp \ + drm/va_drm_utils.c LOCAL_CFLAGS += \ -DANDROID LOCAL_C_INCLUDES += \ $(TARGET_OUT_HEADERS)/libva \ - $(LOCAL_PATH)/x11 + $(TARGET_OUT_HEADERS)/libdrm \ + $(LOCAL_PATH)/drm LOCAL_COPY_HEADERS_TO := libva/va @@ -108,7 +110,7 @@ LOCAL_COPY_HEADERS := va_android.h LOCAL_MODULE_TAGS := optional LOCAL_MODULE := libva-android -LOCAL_SHARED_LIBRARIES := libva +LOCAL_SHARED_LIBRARIES := libva libdrm include $(BUILD_SHARED_LIBRARY) diff --git a/va/android/drmtest.c b/va/android/drmtest.c deleted file mode 100644 index 444ef47..0000000 --- a/va/android/drmtest.c +++ /dev/null @@ -1,139 +0,0 @@ -/* - * Copyright © 2007 Intel Corporation - * - * 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, sublicense, - * 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 NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS 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. - * - * Authors: - * Eric Anholt <e...@anholt.net> - * - */ - -#include <string.h> -#include <fcntl.h> -#include <fnmatch.h> -#include <sys/stat.h> -#include <sys/ioctl.h> -#include "drmtest.h" - -#define LIBUDEV_I_KNOW_THE_API_IS_SUBJECT_TO_CHANGE -#include <libudev.h> - -static int is_master(int fd) -{ - drm_client_t client; - int ret; - - /* Check that we're the only opener and authed. */ - client.idx = 0; - ret = ioctl(fd, DRM_IOCTL_GET_CLIENT, &client); - assert (ret == 0); - if (!client.auth) - return 0; - client.idx = 1; - ret = ioctl(fd, DRM_IOCTL_GET_CLIENT, &client); - if (ret != -1 || errno != EINVAL) - return 0; - - return 1; -} - -/** Open the first DRM device matching the criteria */ -int drm_open_matching(const char *pci_glob, int flags, int *vendor_id, int *device_id) -{ - struct udev *udev; - struct udev_enumerate *e; - struct udev_device *device, *parent; - struct udev_list_entry *entry; - const char *pci_id, *path; - char *tmp; - int fd; - - *vendor_id = 0; - *device_id = 0; - - udev = udev_new(); - if (udev == NULL) { - fprintf(stderr, "failed to initialize udev context\n"); - return -1; - //abort(); - } - - fd = -1; - e = udev_enumerate_new(udev); - udev_enumerate_add_match_subsystem(e, "drm"); - udev_enumerate_scan_devices(e); - udev_list_entry_foreach(entry, udev_enumerate_get_list_entry(e)) { - path = udev_list_entry_get_name(entry); - device = udev_device_new_from_syspath(udev, path); - parent = udev_device_get_parent(device); - /* Filter out KMS output devices. */ - if (strcmp(udev_device_get_subsystem(parent), "pci") != 0) - continue; - pci_id = udev_device_get_property_value(parent, "PCI_ID"); - if (fnmatch(pci_glob, pci_id, 0) != 0) - continue; - fd = open(udev_device_get_devnode(device), O_RDWR); - if (fd < 0) - continue; - if ((flags & DRM_TEST_MASTER) && !is_master(fd)) { - close(fd); - fd = -1; - continue; - } - - break; - } - udev_enumerate_unref(e); - udev_unref(udev); - - *vendor_id = (int) strtol(pci_id, &tmp, 16); - *device_id = (int) strtol((tmp+1), NULL, 16); - - return fd; -} - -int drm_open_any(int *vendor_id, int *device_id) -{ - int fd = drm_open_matching("*:*", 0, vendor_id, device_id); - - if (fd < 0) { - fprintf(stderr, "failed to open any drm device\n"); - //abort(); - } - - return fd; -} - -/** - * Open the first DRM device we can find where we end up being the master. - */ -int drm_open_any_master(void) -{ - int vendor_id, device_id; - int fd = drm_open_matching("*:*", DRM_TEST_MASTER, &vendor_id, &device_id); - - if (fd < 0) { - fprintf(stderr, "failed to open any drm device\n"); - abort(); - } - - return fd; - -} diff --git a/va/android/drmtest.h b/va/android/drmtest.h deleted file mode 100644 index 5f10f08..0000000 --- a/va/android/drmtest.h +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Copyright © 2007 Intel Corporation - * - * 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, sublicense, - * 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 NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS 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. - * - * Authors: - * Eric Anholt <e...@anholt.net> - * - */ - -#include <stdio.h> -#include <stdlib.h> -#include <unistd.h> -#include <assert.h> -#include <errno.h> - -#include "xf86drm.h" - -#define DRM_TEST_MASTER 0x01 - -int drm_open_any(int *vendor_id, int *device_id); -int drm_open_any_master(void); -int drm_open_matching(const char *pci_glob, int flags, int *vendor_id, int *device_id); diff --git a/va/android/va_android.cpp b/va/android/va_android.cpp index 5612c3c..b849eb3 100644 --- a/va/android/va_android.cpp +++ b/va/android/va_android.cpp @@ -28,7 +28,8 @@ #include "va_trace.h" #include "va_fool.h" #include "va_android.h" -#include "va_dricommon.h" /* needs some helper functions from this file */ +#include "va_drmcommon.h" +#include "va_drm_utils.h" #include <stdio.h> #include <stdlib.h> #include <stdarg.h> @@ -39,13 +40,10 @@ #include <fcntl.h> #include <dlfcn.h> #include <errno.h> -#ifndef ANDROID -#include <libudev.h> -#include "drmtest.h" -#endif + #define CHECK_SYMBOL(func) { if (!func) printf("func %s not found\n", #func); return VA_STATUS_ERROR_UNKNOWN; } -#define DEVICE_NAME "/dev/card0" +#define DEVICE_NAME "/dev/dri/card0" static int open_device (char *dev_name) { @@ -89,116 +87,40 @@ static void va_DisplayContextDestroy ( VADisplayContextP pDisplayContext ) { - struct dri_state *dri_state; + struct drm_state *drm_state; if (pDisplayContext == NULL) return; /* close the open-ed DRM fd */ - dri_state = (struct dri_state *)pDisplayContext->pDriverContext->drm_state; - close(dri_state->base.fd); + drm_state = (struct drm_state *)pDisplayContext->pDriverContext->drm_state; + close(drm_state->fd); free(pDisplayContext->pDriverContext->drm_state); free(pDisplayContext->pDriverContext); free(pDisplayContext); } -#ifdef ANDROID static VAStatus va_DisplayContextGetDriverName ( VADisplayContextP pDisplayContext, char **driver_name ) { - VADriverContextP ctx = pDisplayContext->pDriverContext; - struct dri_state *dri_state = (struct dri_state *)ctx->drm_state; - char *driver_name_env; - int vendor_id, device_id; - - struct { - int vendor_id; - int device_id; - char driver_name[64]; - } devices[] = { - { 0x8086, 0x4100, "pvr" }, - { 0x8086, 0x0130, "pvr" }, - { 0x1010, 0x1cf2, "pvr" }, - { 0x0, 0x0, "\0" }, - }; - - memset(dri_state, 0, sizeof(*dri_state)); - dri_state->base.fd = open_device((char *)DEVICE_NAME); - - if (dri_state->base.fd < 0) { - fprintf(stderr,"can't open DRM devices\n"); - return VA_STATUS_ERROR_UNKNOWN; - } + VADriverContextP const ctx = pDisplayContext->pDriverContext; + struct drm_state * drm_state = (struct drm_state *)ctx->drm_state; - /* TBD: other vendor driver names */ - vendor_id = devices[0].vendor_id; - device_id = devices[0].device_id; - *driver_name = strdup(devices[0].driver_name); - - dri_state->base.auth_type = VA_DUMMY; + memset(drm_state, 0, sizeof(*drm_state)); + drm_state->fd = open_device((char *)DEVICE_NAME); - return VA_STATUS_SUCCESS; -} -#else -static VAStatus va_DisplayContextGetDriverName ( - VADisplayContextP pDisplayContext, - char **driver_name -) -{ - VADriverContextP ctx = pDisplayContext->pDriverContext; - struct dri_state *dri_state = (struct dri_state *)ctx->drm_state; - char *driver_name_env; - int vendor_id, device_id; - int i = 0; - - struct { - int vendor_id; - int device_id; - char driver_name[64]; - } devices[] = { - { 0x8086, 0x4100, "pvr" }, - { 0x8086, 0x0130, "pvr" }, - { 0x1010, 0x1cf2, "pvr" }, - { 0x0, 0x0, "\0" }, - }; - - memset(dri_state, 0, sizeof(*dri_state)); - dri_state->base.fd = drm_open_any(&vendor_id, &device_id); - - if (dri_state->base.fd < 0) { + if (drm_state->fd < 0) { fprintf(stderr,"can't open DRM devices\n"); return VA_STATUS_ERROR_UNKNOWN; } - - /* TBD: other vendor driver names */ - - while (devices[i].device_id != 0) { - if ((devices[i].vendor_id == vendor_id) && - (devices[i].device_id == device_id)) - break; - i++; - } - - if (devices[i].device_id != 0) - *driver_name = strdup(devices[i].driver_name); - else { - fprintf(stderr,"device (0x%04x:0x%04x) is not supported\n", - vendor_id, device_id); - - return VA_STATUS_ERROR_UNKNOWN; - } - - printf("DRM device is opened, loading driver %s for device 0x%04x:0x%04x\n", - driver_name, vendor_id, device_id); - - dri_state->base.auth_type = VA_DUMMY; + drm_state->auth_type = VA_DRM_AUTH_CUSTOM; - return VA_STATUS_SUCCESS; + return VA_DRM_GetDriverName(ctx, driver_name); } -#endif + VADisplay vaGetDisplay ( void *native_dpy /* implementation specific */ @@ -213,12 +135,12 @@ VADisplay vaGetDisplay ( if (!dpy) { /* create new entry */ - VADriverContextP pDriverContext; - struct dri_state *dri_state; + VADriverContextP pDriverContext = 0; + struct drm_state *drm_state = 0; pDisplayContext = (VADisplayContextP)calloc(1, sizeof(*pDisplayContext)); pDriverContext = (VADriverContextP)calloc(1, sizeof(*pDriverContext)); - dri_state = (struct dri_state*)calloc(1, sizeof(*dri_state)); - if (pDisplayContext && pDriverContext && dri_state) + drm_state = (struct drm_state*)calloc(1, sizeof(*drm_state)); + if (pDisplayContext && pDriverContext && drm_state) { pDisplayContext->vadpy_magic = VA_DISPLAY_MAGIC; @@ -228,7 +150,7 @@ VADisplay vaGetDisplay ( pDisplayContext->vaIsValid = va_DisplayContextIsValid; pDisplayContext->vaDestroy = va_DisplayContextDestroy; pDisplayContext->vaGetDriverName = va_DisplayContextGetDriverName; - pDriverContext->drm_state = dri_state; + pDriverContext->drm_state = drm_state; dpy = (VADisplay)pDisplayContext; } else @@ -237,8 +159,8 @@ VADisplay vaGetDisplay ( free(pDisplayContext); if (pDriverContext) free(pDriverContext); - if (dri_state) - free(dri_state); + if (drm_state) + free(drm_state); } } @@ -249,7 +171,6 @@ VADisplay vaGetDisplay ( #define CHECK_DISPLAY(dpy) if( !vaDisplayIsValid(dpy) ) { return VA_STATUS_ERROR_INVALID_DISPLAY; } -#ifdef ANDROID extern "C" { extern int fool_postp; /* do nothing for vaPutSurface if set */ extern int trace_flag; /* trace vaPutSurface parameters */ @@ -308,24 +229,4 @@ VAStatus vaPutSurface ( destx, desty, destw, desth, cliprects, number_cliprects, flags ); } -#else -VAStatus vaPutSurface ( - VADisplay dpy, - VASurfaceID surface, - void *draw, - short srcx, - short srcy, - unsigned short srcw, - unsigned short srch, - short destx, - short desty, - unsigned short destw, - unsigned short desth, - VARectangle *cliprects, /* client supplied clip list */ - unsigned int number_cliprects, /* number of clip rects in the clip list */ - unsigned int flags /* de-interlacing flags */ -) -{ - return VA_STATUS_SUCCESS; -} -#endif + -- 1.7.5.4 _______________________________________________ Libva mailing list Libva@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libva