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

Haitao Huang haitao.huang at intel.com
Mon Aug 20 12:52:45 PDT 2012


Change the driver used for android on IA.
With GENx enabled for big cores, libva has to load the correct
drivder 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 7b0c86c..07a8e8f 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 
 
 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 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