[Libva] [PATCH v2 4/4] va_android: use common drm driver detection

Haitao Huang haitao.huang at intel.com
Tue Aug 21 11:26:28 PDT 2012


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 at intel.com> (change driver)
Signed-off-by: Haitao Huang <haitao.huang at 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 <eric at 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 at 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



More information about the Libva mailing list