summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHaitao Huang <haitao.huang@intel.com>2012-08-21 13:26:28 -0500
committerGwenole Beauchesne <gwenole.beauchesne@intel.com>2012-09-28 10:34:04 +0200
commit7821afeffe8f2a64a556218c1c139b7ad64a0cc2 (patch)
treeaf3861946417f0d0ca2ac9d0092253dd2b9d6135
parent23872f0ddbe56ec5cc41e660a2d60eb20d3d2f5b (diff)
downloadlibva-7821afeffe8f2a64a556218c1c139b7ad64a0cc2.tar.gz
android: use common DRM driver detection code.
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.charles@intel.com> (change driver) Signed-off-by: Haitao Huang <haitao.huang@intel.com> (update using drm util) Signed-off-by: Gwenole Beauchesne <gwenole.beauchesne@intel.com> (add missing headers)
-rwxr-xr-xva/Android.mk8
-rw-r--r--va/android/drmtest.c139
-rw-r--r--va/android/drmtest.h40
-rw-r--r--va/android/va_android.cpp149
4 files changed, 29 insertions, 307 deletions
diff --git a/va/Android.mk b/va/Android.mk
index 381c04e..cf63bd7 100755
--- a/va/Android.mk
+++ b/va/Android.mk
@@ -93,14 +93,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 -DLOG_TAG=\"libva-android\"
LOCAL_C_INCLUDES += \
$(TARGET_OUT_HEADERS)/libva \
- $(LOCAL_PATH)/x11
+ $(TARGET_OUT_HEADERS)/libdrm \
+ $(LOCAL_PATH)/drm
LOCAL_COPY_HEADERS_TO := libva/va
@@ -109,7 +111,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 <eric@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 <eric@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..f042786 100644
--- a/va/android/va_android.cpp
+++ b/va/android/va_android.cpp
@@ -23,29 +23,25 @@
*/
#define _GNU_SOURCE 1
+#include "sysdeps.h"
#include "va.h"
#include "va_backend.h"
#include "va_trace.h"
#include "va_fool.h"
#include "va_android.h"
-#include "va_dricommon.h" /* needs some helper functions from this file */
-#include <stdio.h>
-#include <stdlib.h>
+#include "va_drmcommon.h"
+#include "va_drm_utils.h"
#include <stdarg.h>
-#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#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 +85,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 +133,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 +148,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 +157,8 @@ VADisplay vaGetDisplay (
free(pDisplayContext);
if (pDriverContext)
free(pDriverContext);
- if (dri_state)
- free(dri_state);
+ if (drm_state)
+ free(drm_state);
}
}
@@ -249,7 +169,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 +227,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
+