summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSean Paul <seanpaul@chromium.org>2015-02-09 02:39:09 -0500
committerTomasz Figa <tfiga@google.com>2015-05-30 15:51:14 +0900
commit879cc4e7c6da5ecf631d65ddd98d12bccd5817f5 (patch)
treec8e2b058c99eace17d557a61dacf7ea24c4294db
parentd225ab0eaecac84e5fd7199968a433a462af0196 (diff)
downloaddrm_gralloc-879cc4e7c6da5ecf631d65ddd98d12bccd5817f5.tar.gz
drm_gralloc: Use render node
Change-Id: I9bbee113e884d0c512a855e85fa88db4e3789a1e Signed-off-by: Sean Paul <seanpaul@chromium.org> Signed-off-by: Tomasz Figa <tfiga@google.com>
-rw-r--r--Android.mk4
-rw-r--r--gralloc.cpp26
-rw-r--r--gralloc_drm.cpp57
-rw-r--r--gralloc_drm.h8
-rw-r--r--gralloc_drm_handle.h23
5 files changed, 33 insertions, 85 deletions
diff --git a/Android.mk b/Android.mk
index f4d4483..ee53679 100644
--- a/Android.mk
+++ b/Android.mk
@@ -93,6 +93,7 @@ LOCAL_SHARED_LIBRARIES := \
liblog \
libcutils \
libhardware_legacy \
+ libutils
ifneq ($(filter $(intel_drivers), $(DRM_GPU_DRIVERS)),)
LOCAL_SRC_FILES += gralloc_drm_intel.c
@@ -154,11 +155,12 @@ LOCAL_SRC_FILES := \
LOCAL_C_INCLUDES := \
external/libdrm \
- external/libdrm/include/drm \
+ external/libdrm/include/drm
LOCAL_SHARED_LIBRARIES := \
libgralloc_drm \
liblog \
+ libutils
# for glFlush/glFinish
LOCAL_SHARED_LIBRARIES += \
diff --git a/gralloc.cpp b/gralloc.cpp
index 3c377c6..521d6cb 100644
--- a/gralloc.cpp
+++ b/gralloc.cpp
@@ -69,30 +69,6 @@ static int drm_mod_perform(const struct gralloc_module_t *mod, int op, ...)
err = 0;
}
break;
- /* should we remove this and next ops, and make it transparent? */
- case GRALLOC_MODULE_PERFORM_GET_DRM_MAGIC:
- {
- int32_t *magic = va_arg(args, int32_t *);
- err = gralloc_drm_get_magic(dmod->drm, magic);
- }
- break;
- case GRALLOC_MODULE_PERFORM_AUTH_DRM_MAGIC:
- {
- int32_t magic = va_arg(args, int32_t);
- err = gralloc_drm_auth_magic(dmod->drm, magic);
- }
- break;
- case GRALLOC_MODULE_PERFORM_ENTER_VT:
- {
- err = gralloc_drm_set_master(dmod->drm);
- }
- break;
- case GRALLOC_MODULE_PERFORM_LEAVE_VT:
- {
- gralloc_drm_drop_master(dmod->drm);
- err = 0;
- }
- break;
default:
err = -EINVAL;
break;
@@ -150,8 +126,10 @@ static int drm_mod_unlock(const gralloc_module_t *mod, buffer_handle_t handle)
static int drm_mod_close_gpu0(struct hw_device_t *dev)
{
+ struct drm_module_t *dmod = (struct drm_module_t *)dev->module;
struct alloc_device_t *alloc = (struct alloc_device_t *) dev;
+ gralloc_drm_destroy(dmod->drm);
delete alloc;
return 0;
diff --git a/gralloc_drm.cpp b/gralloc_drm.cpp
index 8826f73..ebff717 100644
--- a/gralloc_drm.cpp
+++ b/gralloc_drm.cpp
@@ -25,6 +25,7 @@
#include <cutils/log.h>
#include <cutils/atomic.h>
+#include <cutils/properties.h>
#include <stdlib.h>
#include <errno.h>
#include <sys/types.h>
@@ -36,8 +37,6 @@
#define unlikely(x) __builtin_expect(!!(x), 0)
-#define GRALLOC_DRM_DEVICE "/dev/dri/card0"
-
static int32_t gralloc_drm_pid = 0;
/*
@@ -101,6 +100,7 @@ init_drv_from_fd(int fd)
*/
struct gralloc_drm_t *gralloc_drm_create(void)
{
+ char path[PROPERTY_VALUE_MAX];
struct gralloc_drm_t *drm;
int err;
@@ -108,9 +108,10 @@ struct gralloc_drm_t *gralloc_drm_create(void)
if (!drm)
return NULL;
- drm->fd = open(GRALLOC_DRM_DEVICE, O_RDWR);
+ property_get("gralloc.drm.device", path, "/dev/dri/renderD128");
+ drm->fd = open(path, O_RDWR);
if (drm->fd < 0) {
- ALOGE("failed to open %s", GRALLOC_DRM_DEVICE);
+ ALOGE("failed to open %s", path);
return NULL;
}
@@ -144,42 +145,6 @@ int gralloc_drm_get_fd(struct gralloc_drm_t *drm)
}
/*
- * Get the magic for authentication.
- */
-int gralloc_drm_get_magic(struct gralloc_drm_t *drm, int32_t *magic)
-{
- return drmGetMagic(drm->fd, (drm_magic_t *) magic);
-}
-
-/*
- * Authenticate a magic.
- */
-int gralloc_drm_auth_magic(struct gralloc_drm_t *drm, int32_t magic)
-{
- return drmAuthMagic(drm->fd, (drm_magic_t) magic);
-}
-
-/*
- * Set as the master of a DRM device.
- */
-int gralloc_drm_set_master(struct gralloc_drm_t *drm)
-{
- ALOGD("set master");
- drmSetMaster(drm->fd);
- drm->first_post = 1;
-
- return 0;
-}
-
-/*
- * Drop from the master of a DRM device.
- */
-void gralloc_drm_drop_master(struct gralloc_drm_t *drm)
-{
- drmDropMaster(drm->fd);
-}
-
-/*
* Validate a buffer handle and return the associated bo.
*/
static struct gralloc_drm_bo_t *validate_handle(buffer_handle_t _handle,
@@ -191,6 +156,7 @@ static struct gralloc_drm_bo_t *validate_handle(buffer_handle_t _handle,
return NULL;
/* the buffer handle is passed to a new process */
+ ALOGE("data_owner=%d gralloc_pid=%d data=%p\n", handle->data_owner, gralloc_drm_get_pid(), handle->data);
if (unlikely(handle->data_owner != gralloc_drm_pid)) {
struct gralloc_drm_bo_t *bo;
@@ -198,8 +164,10 @@ static struct gralloc_drm_bo_t *validate_handle(buffer_handle_t _handle,
if (!drm)
return NULL;
+ ALOGE("handle: name=%d pfd=%d\n", handle->name,
+ handle->prime_fd);
/* create the struct gralloc_drm_bo_t locally */
- if (handle->name)
+ if (handle->name || handle->prime_fd >= 0)
bo = drm->drv->alloc(drm->drv, handle);
else /* an invalid handle */
bo = NULL;
@@ -263,6 +231,7 @@ static struct gralloc_drm_handle_t *create_bo_handle(int width,
handle->height = height;
handle->format = format;
handle->usage = usage;
+ handle->prime_fd = -1;
return handle;
}
@@ -347,12 +316,6 @@ buffer_handle_t gralloc_drm_bo_get_handle(struct gralloc_drm_bo_t *bo, int *stri
return &bo->handle->base;
}
-int gralloc_drm_get_gem_handle(buffer_handle_t _handle)
-{
- struct gralloc_drm_handle_t *handle = gralloc_drm_handle(_handle);
- return (handle) ? handle->name : 0;
-}
-
/*
* Query YUV component offsets for a buffer handle
*/
diff --git a/gralloc_drm.h b/gralloc_drm.h
index 1b464cf..3ad818f 100644
--- a/gralloc_drm.h
+++ b/gralloc_drm.h
@@ -38,20 +38,12 @@ struct gralloc_drm_bo_t;
enum {
GRALLOC_MODULE_PERFORM_GET_DRM_FD = 0x80000002,
- GRALLOC_MODULE_PERFORM_GET_DRM_MAGIC = 0x80000003,
- GRALLOC_MODULE_PERFORM_AUTH_DRM_MAGIC = 0x80000004,
- GRALLOC_MODULE_PERFORM_ENTER_VT = 0x80000005,
- GRALLOC_MODULE_PERFORM_LEAVE_VT = 0x80000006,
};
struct gralloc_drm_t *gralloc_drm_create(void);
void gralloc_drm_destroy(struct gralloc_drm_t *drm);
int gralloc_drm_get_fd(struct gralloc_drm_t *drm);
-int gralloc_drm_get_magic(struct gralloc_drm_t *drm, int32_t *magic);
-int gralloc_drm_auth_magic(struct gralloc_drm_t *drm, int32_t magic);
-int gralloc_drm_set_master(struct gralloc_drm_t *drm);
-void gralloc_drm_drop_master(struct gralloc_drm_t *drm);
static inline int gralloc_drm_get_bpp(int format)
{
diff --git a/gralloc_drm_handle.h b/gralloc_drm_handle.h
index 6bf2d2f..313628f 100644
--- a/gralloc_drm_handle.h
+++ b/gralloc_drm_handle.h
@@ -36,9 +36,10 @@ struct gralloc_drm_bo_t;
struct gralloc_drm_handle_t {
native_handle_t base;
-#define GRALLOC_DRM_HANDLE_MAGIC 0x12345678
-#define GRALLOC_DRM_HANDLE_NUM_INTS 10
-#define GRALLOC_DRM_HANDLE_NUM_FDS 0
+ /* file descriptors */
+ int prime_fd;
+
+ /* integers */
int magic;
int width;
@@ -49,9 +50,17 @@ struct gralloc_drm_handle_t {
int name; /* the name of the bo */
int stride; /* the stride in bytes */
- int data_owner; /* owner of data (for validation) */
struct gralloc_drm_bo_t *data; /* pointer to struct gralloc_drm_bo_t */
+
+ // FIXME: the attributes below should be out-of-line
+ uint64_t unknown __attribute__((aligned(8)));
+ int data_owner; /* owner of data (for validation) */
};
+#define GRALLOC_DRM_HANDLE_MAGIC 0x12345678
+#define GRALLOC_DRM_HANDLE_NUM_FDS 1
+#define GRALLOC_DRM_HANDLE_NUM_INTS ( \
+ ((sizeof(struct gralloc_drm_handle_t) - sizeof(native_handle_t))/sizeof(int)) \
+ - GRALLOC_DRM_HANDLE_NUM_FDS)
static inline struct gralloc_drm_handle_t *gralloc_drm_handle(buffer_handle_t _handle)
{
@@ -61,8 +70,12 @@ static inline struct gralloc_drm_handle_t *gralloc_drm_handle(buffer_handle_t _h
if (handle && (handle->base.version != sizeof(handle->base) ||
handle->base.numInts != GRALLOC_DRM_HANDLE_NUM_INTS ||
handle->base.numFds != GRALLOC_DRM_HANDLE_NUM_FDS ||
- handle->magic != GRALLOC_DRM_HANDLE_MAGIC))
+ handle->magic != GRALLOC_DRM_HANDLE_MAGIC)) {
+ ALOGE("invalid handle: version=%d, numInts=%d, numFds=%d, magic=%x",
+ handle->base.version, handle->base.numInts,
+ handle->base.numFds, handle->magic);
handle = NULL;
+ }
return handle;
}